الاتصال بالهوية المدارة بقاعدة بيانات Azure ل PostgreSQL - خادم مرن

ينطبق على: قاعدة بيانات Azure ل PostgreSQL - خادم مرن

يمكنك استخدام كل من الهويات المدارة المعينة من قبل النظام والمخصصة من قبل المستخدم للمصادقة على قاعدة بيانات Azure لخادم PostgreSQL المرن. توضح هذه المقالة كيفية استخدام هوية مدارة معينة من قبل النظام لجهاز Azure الظاهري (VM) للوصول إلى قاعدة بيانات Azure لمثيل خادم PostgreSQL المرن. تتم إدارة الهويات المدارة تلقائيا بواسطة Azure وتمكنك من المصادقة على الخدمات التي تدعم مصادقة Microsoft Entra دون الحاجة إلى إدراج بيانات الاعتماد في التعليمات البرمجية الخاصة بك.

‏‫ستتعلم كيفية:

  • امنح الجهاز الظاهري حق الوصول إلى قاعدة بيانات Azure لمثيل خادم PostgreSQL المرن.
  • إنشاء مستخدم في قاعدة البيانات التي تمثل الهوية المعينة من قبل النظام للجهاز الظاهري.
  • احصل على رمز مميز للوصول باستخدام هوية الجهاز الظاهري واستخدمه للاستعلام عن قاعدة بيانات Azure لمثيل خادم PostgreSQL المرن.
  • تنفيذ استرداد الرمز المميز في تطبيق مثال C#‎.

المتطلبات الأساسية

  • إذا لم تكن على دراية بالهويات المُدارة لميزة موارد Azure، فراجع نظرة عامة. إذا لم يكن لديك حساب Azure، فاشترك للحصول على حساب مجاني قبل المتابعة.
  • للقيام بإنشاء الموارد وإدارة الأدوار المطلوبة، يحتاج حسابك إلى أذونات "المالك" في النطاق المناسب (اشتراكك أو مجموعة الموارد). إذا كنت بحاجة إلى مساعدة في تعيين دور، فشاهد تعيين أدوار Azure لإدارة الوصول إلى موارد اشتراك Azure.
  • تحتاج إلى جهاز Azure ظاهري (على سبيل المثال، تشغيل Ubuntu Linux) الذي ترغب في استخدامه للوصول إلى قاعدة البيانات باستخدام الهوية المدارة
  • تحتاج إلى قاعدة بيانات Azure لمثيل خادم PostgreSQL المرن الذي تم تكوين مصادقة Microsoft Entra له
  • لاتباع مثال C#، أولا، أكمل الدليل حول كيفية الاتصال ب C#‎

إنشاء هوية مدارة معينة من قبل النظام لجهازك الظاهري

استخدم az vm identity assign مع identity assign الأمر لتمكين الهوية المعينة من قبل النظام إلى جهاز ظاهري موجود:

az vm identity assign -g myResourceGroup -n myVm

استرداد معرف التطبيق للهوية المدارة المعينة من قبل النظام، والتي ستحتاجها في الخطوات القليلة التالية:

# Get the client ID (application ID) of the system-assigned managed identity

az ad sp list --display-name vm-name --query [*].appId --out tsv

إنشاء مستخدم خادم مرن لقاعدة بيانات Azure ل PostgreSQL للهوية المدارة

الآن، اتصل كمستخدم مسؤول Microsoft Entra بقاعدة بيانات الخادم المرنة ل Azure Database for PostgreSQL، وقم بتشغيل عبارات SQL التالية، واستبدل <identity_name> باسم الموارد التي قمت بإنشاء هوية مدارة معينة من قبل النظام لها:

يرجى ملاحظة أنه يجب تشغيل pgaadauth_create_principal على قاعدة بيانات Postgres.

select * from pgaadauth_create_principal('<identity_name>', false, false);

يبدو النجاح كما يلي:

    pgaadauth_create_principal
-----------------------------------
 Created role for "<identity_name>"
(1 row)

لمزيد من المعلومات حول إدارة أدوار قاعدة البيانات الممكنة لمعرف Microsoft Entra، راجع كيفية إدارة قاعدة بيانات Azure ID الممكنة من Microsoft Entra ل PostgreSQL - أدوار الخادم المرن

تتمتع الهوية المدارة الآن بالوصول عند المصادقة باسم الهوية كاسم دور والرمز المميز ل Microsoft Entra ككلمة مرور.

إشعار

إذا كانت الهوية المدارة غير صالحة، يتم إرجاع خطأ: ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...].

إشعار

إذا رأيت خطأ مثل "لا توجد دالة تطابق..."، فتأكد من أنك تتصل بقاعدة postgres البيانات، وليس قاعدة بيانات مختلفة قمت بإنشائها أيضا.

استرداد الرمز المميز للوصول من خدمة بيانات تعريف مثيل Azure

يمكن لتطبيقك الآن استرداد رمز وصول من خدمة بيانات تعريف مثيل Azure واستخدامه للمصادقة مع قاعدة البيانات.

يتم استرداد الرمز المميز هذا عن طريق إجراء طلب HTTP إلى http://169.254.169.254/metadata/identity/oauth2/token وتمرير المعلمات التالية:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (التي قمت باستردادها سابقاً)

يمكنك الحصول على نتيجة JSON تحتوي على access_token حقل - هذه القيمة النصية الطويلة هي الرمز المميز للوصول إلى الهوية المدارة الذي يجب استخدامه ككلمة مرور عند الاتصال بقاعدة البيانات.

لأغراض الاختبار، يمكنك تشغيل الأوامر التالية في shell الخاص بك.

إشعار

لاحظ أنك بحاجة إلى curlتثبيت jqالعميل و psql.

# Retrieve the access token

export PGPASSWORD=`curl -s 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fossrdbms-aad.database.windows.net&client_id=CLIENT_ID' -H Metadata:true | jq -r .access_token`

# Connect to the database

psql -h SERVER --user USER DBNAME

أنت الآن متصل بقاعدة البيانات التي قمت بتكوينها سابقا.

الاتصال باستخدام الهوية المدارة

يوضح هذا القسم كيفية الحصول على رمز مميز للوصول باستخدام الهوية المدارة المعينة من قبل المستخدم للجهاز الظاهري واستخدامها للاتصال بقاعدة بيانات Azure لخادم PostgreSQL المرن. يدعم خادم Azure Database for PostgreSQL المرن في الأصل مصادقة Microsoft Entra، بحيث يمكنه قبول رموز الوصول المميزة التي تم الحصول عليها مباشرة باستخدام الهويات المدارة لموارد Azure. عند إنشاء اتصال بقاعدة بيانات Azure لخادم PostgreSQL المرن، يمكنك تمرير رمز الوصول المميز في حقل كلمة المرور.

الاتصال باستخدام الهوية المدارة في Python

للحصول على مثال التعليمات البرمجية ل Python، يرجى الرجوع إلى التشغيل السريع: استخدام Python للاتصال والاستعلام عن البيانات في قاعدة بيانات Azure ل PostgreSQL - الخادم المرن

الاتصال باستخدام الهوية المدارة في Java

للحصول على مثال التعليمات البرمجية ل Java، يرجى الرجوع إلى التشغيل السريع: استخدام Java وJDBC مع قاعدة بيانات Azure ل PostgreSQL - الخادم المرن

الاتصال باستخدام الهوية المدارة في C#‎

فيما يلي مثال على التعليمات البرمجية ل .NET لفتح اتصال بقاعدة بيانات Azure لخادم PostgreSQL المرن باستخدام رمز مميز للوصول. يجب تشغيل هذه التعليمة البرمجية على الجهاز الظاهري لاستخدام الهوية المدارة المعينة من قبل النظام للحصول على رمز وصول من معرف Microsoft Entra. استبدل قيم HOST وUSER (ب <identity_name>) و DATABASE.

using System;
using System.Net;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using Npgsql;
using Azure.Identity;

namespace Driver
{
    class Script
    {
        // Obtain connection string information from the portal for use in the following variables
        private static string Host = "HOST";
        private static string User = "USER";
        private static string Database = "DATABASE";

        static async Task Main(string[] args)
        {
            //
            // Get an access token for PostgreSQL.
            //
            Console.Out.WriteLine("Getting access token from Azure AD...");

            // Azure AD resource ID for Azure Database for PostgreSQL Flexible Server is https://ossrdbms-aad.database.windows.net/
            string accessToken = null;

            try
            {
                // Call managed identities for Azure resources endpoint.
                var sqlServerTokenProvider = new DefaultAzureCredential();
                accessToken = (await sqlServerTokenProvider.GetTokenAsync(
                    new Azure.Core.TokenRequestContext(scopes: new string[] { "https://ossrdbms-aad.database.windows.net/.default" }) { })).Token;

            }
            catch (Exception e)
            {
                Console.Out.WriteLine("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
                System.Environment.Exit(1);
            }

            //
            // Open a connection to the PostgreSQL server using the access token.
            //
            string connString =
                String.Format(
                    "Server={0}; User Id={1}; Database={2}; Port={3}; Password={4}; SSLMode=Prefer",
                    Host,
                    User,
                    Database,
                    5432,
                    accessToken);

            using (var conn = new NpgsqlConnection(connString))
            {
                Console.Out.WriteLine("Opening connection using access token...");
                conn.Open();

                using (var command = new NpgsqlCommand("SELECT version()", conn))
                {

                    var reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        Console.WriteLine("\nConnected!\n\nPostgres version: {0}", reader.GetString(0));
                    }
                }
            }
        }
    }
}

عند التشغيل، يعطي هذا الأمر إخراجا مثل هذا:

Getting access token from Azure AD...
Opening connection using access token...

Connected!

Postgres version: PostgreSQL 11.11, compiled by Visual C++ build 1800, 64-bit 

الخطوات التالية