البرنامج التعليمي: إنشاء اتصال بدون كلمة مرور بخدمة قاعدة بيانات عبر Service Connector

تستخدم الاتصالات بدون كلمة مرور الهويات المدارة للوصول إلى خدمات Azure. باستخدام هذا النهج، لا يتعين عليك تعقب البيانات السرية للهويات المدارة وإدارتها يدويا. تتم معالجة هذه المهام داخليا بأمان بواسطة Azure.

يمكن Service Connector الهويات المدارة في خدمات استضافة التطبيقات مثل Azure Spring Apps وAzure App Service وAzure Container Apps. يقوم Service Connector أيضا بتكوين خدمات قاعدة البيانات، مثل قاعدة بيانات Azure ل PostgreSQL، وقاعدة بيانات Azure ل MySQL، وقاعدة بيانات Azure SQL، لقبول الهويات المدارة.

في هذا البرنامج التعليمي، يمكنك استخدام Azure CLI لإكمال المهام التالية:

  • تحقق من بيئتك الأولية باستخدام Azure CLI.
  • إنشاء اتصال بدون كلمة مرور باستخدام Service Connector.
  • استخدم متغيرات البيئة أو التكوينات التي تم إنشاؤها بواسطة Service Connector للوصول إلى خدمة قاعدة بيانات.

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

إعداد بيئتك

العميل

سجل الدخول باستخدام Azure CLI عبر az login. إذا كنت تستخدم Azure Cloud Shell أو قمت بتسجيل الدخول بالفعل، فتأكد من حسابك المصادق عليه باستخدام az account show.

تثبيت ملحق Service Connector بدون كلمة مرور

تثبيت أحدث ملحق Service Connector بدون كلمة مرور ل Azure CLI:

az extension add --name serviceconnector-passwordless --upgrade

إشعار

يرجى التحقق من أن إصدار الملحق "serviceconnector-passwordless" هو "2.0.2" أو أعلى عن طريق تشغيل az version. قد تحتاج إلى ترقية Azure CLI أولا لترقية إصدار الملحق.

إنشاء اتصال بدون كلمة مرور

بعد ذلك، نستخدم Azure App Service كمثال لإنشاء اتصال باستخدام الهوية المدارة.

إذا كنت تستخدم:

إشعار

إذا كنت تستخدم مدخل Microsoft Azure، فانتقل إلى شفرة Service Connector من Azure App Service أو Azure Spring Apps أو Azure Container Apps، وحدد Create لإنشاء اتصال. سيقوم مدخل Azure تلقائيا بإنشاء الأمر نيابة عنك وتشغيل تنفيذ الأمر على Cloud Shell.

يستخدم أمر Azure CLI التالي معلمة --client-type ، ويمكن أن يكون java وdotnet وpython وما إلى ذلك. قم بتشغيل az webapp connection create postgres-flexible -h للحصول على أنواع العملاء المدعومة، واختر النوع الذي يتطابق مع التطبيق الخاص بك.

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type $CLIENT_TYPE

Azure Database for MySQL - يتطلب الخادم المرن هوية مدارة يعينها المستخدم لتمكين مصادقة Microsoft Entra. لمزيد من المعلومات، راجع إعداد مصادقة Microsoft Entra لقاعدة بيانات Azure ل MySQL - الخادم المرن. يمكنك استخدام الأمر التالي لإنشاء هوية مدارة يعينها المستخدم:

USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

هام

بعد إنشاء الهوية المدارة المعينة من قبل المستخدم، اطلب من المسؤول العام أو مسؤول الدور المميز منح الأذونات التالية لهذه الهوية:

  • User.Read.All
  • GroupMember.Read.All
  • Application.Read.All

لمزيد من المعلومات، راجع قسم الأذونات في مصادقة Active Directory.

ثم قم بتوصيل تطبيقك بقاعدة بيانات MySQL بهوية مدارة معينة من قبل النظام باستخدام Service Connector.

يستخدم أمر Azure CLI التالي معلمة --client-type . az webapp connection create mysql-flexible -h قم بتشغيل للحصول على أنواع العملاء المدعومة، واختر النوع الذي يطابق التطبيق الخاص بك.

az webapp connection create mysql-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $MYSQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX mysql-identity-id=$IDENTITY_RESOURCE_ID \
    --client-type java

يستخدم أمر Azure CLI التالي معلمة --client-type . az webapp connection create sql -h قم بتشغيل للحصول على أنواع العملاء المدعومة، واختر النوع الذي يطابق التطبيق الخاص بك.

az webapp connection create sql \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $SQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type dotnet

يكمل أمر Service Connector هذا المهام التالية في الخلفية:

  • تمكين الهوية المدارة المعينة من قبل النظام، أو تعيين هوية مستخدم للتطبيق $APPSERVICE_NAME الذي تستضيفه Azure App Service/Azure Spring Apps/Azure Container Apps.
  • تمكين مصادقة Microsoft Entra لخادم قاعدة البيانات إذا لم يتم تمكينها من قبل.
  • تعيين مسؤول Microsoft Entra إلى المستخدم الحالي الذي قام بتسجيل الدخول.
  • إضافة مستخدم قاعدة بيانات للهوية المدارة المعينة من قبل النظام أو الهوية المدارة المعينة من قبل المستخدم أو كيان الخدمة. منح كافة امتيازات قاعدة البيانات $DATABASE_NAME لهذا المستخدم. يمكن العثور على اسم المستخدم في سلسلة الاتصال في إخراج الأمر السابق.
  • تعيين التكوينات المسماة AZURE_MYSQL_CONNECTIONSTRINGأو AZURE_POSTGRESQL_CONNECTIONSTRINGأو AZURE_SQL_CONNECTIONSTRING إلى مورد Azure استنادا إلى نوع قاعدة البيانات.
    • بالنسبة ل App Service، يتم تعيين التكوينات في شفرة App Settings .
    • بالنسبة لتطبيقات Spring، يتم تعيين التكوينات عند تشغيل التطبيق.
    • بالنسبة لتطبيقات الحاوية، يتم تعيين التكوينات إلى متغيرات البيئة. يمكنك الحصول على جميع التكوينات وقيمها في شفرة Service Connector في مدخل Microsoft Azure.

سيقوم Service Connector بتعيين الامتيازات التالية للمستخدم، ويمكنك إبطالها وضبط الامتيازات بناء على متطلباتك.

GRANT ALL PRIVILEGES ON DATABASE "$DATABASE_NAME" TO "username"; 

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO 'username'@'%'; 
GRANT CONTROL ON DATABASE::"$DATABASE_NAME" TO "username";

الاتصال بقاعدة بيانات باستخدام مصادقة Microsoft Entra

بعد إنشاء الاتصال، يمكنك استخدام سلسلة الاتصال في التطبيق الخاص بك للاتصال بقاعدة البيانات باستخدام مصادقة Microsoft Entra. على سبيل المثال، يمكنك استخدام الحلول التالية للاتصال بقاعدة البيانات باستخدام مصادقة Microsoft Entra.

بالنسبة ل .NET، لا يوجد مكون إضافي أو مكتبة لدعم الاتصالات بدون كلمة مرور. يمكنك الحصول على رمز وصول للهوية المدارة أو كيان الخدمة باستخدام مكتبة العميل مثل Azure.Identity. ثم يمكنك استخدام الرمز المميز للوصول ككلمة مرور للاتصال بقاعدة البيانات. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه.

using Azure.Identity;
using Azure.Core;
using Npgsql;

// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();

// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
//     }
// );

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTSECRET");
// var sqlServerTokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);

// Acquire the access token. 
AccessToken accessToken = await sqlServerTokenProvider.GetTokenAsync(
    new TokenRequestContext(scopes: new string[]
    {
        "https://ossrdbms-aad.database.windows.net/.default"
    }));

// Combine the token with the connection string from the environment variables provided by Service Connector.
string connectionString =
    $"{Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING")};Password={accessToken.Token}";

// Establish the connection.
using (var connection = new NpgsqlConnection(connectionString))
{
    Console.WriteLine("Opening connection using access token...");
    connection.Open();
}

بعد ذلك، إذا قمت بإنشاء جداول وتسلسلات في خادم PostgreSQL المرن قبل استخدام Service Connector، فستحتاج إلى الاتصال كمالك ومنح الإذن لإنشاء <aad-username> بواسطة Service Connector. يجب أن يبدو اسم المستخدم من سلسلة الاتصال أو التكوين الذي تم تعيينه بواسطة Service Connector مثل aad_<connection name>. إذا كنت تستخدم مدخل Microsoft Azure، فحدد زر التوسيع بجوار Service Type العمود والحصول على القيمة. إذا كنت تستخدم Azure CLI، فتحقق من configurations إخراج أمر CLI.

ثم قم بتنفيذ الاستعلام لمنح الإذن

az extension add --name rdbms-connect

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"<aad-username>\";GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"<aad username>\";"

و <owner-username> <owner-password> هو مالك الجدول الموجود الذي يمكنه منح أذونات للآخرين. <aad-username> هو المستخدم الذي تم إنشاؤه بواسطة Service Connector. استبدلها بالقيمة الفعلية.

تحقق من صحة النتيجة باستخدام الأمر :

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "SELECT distinct(table_name) FROM information_schema.table_privileges WHERE grantee='<aad-username>' AND table_schema='public';" --output table

بالنسبة ل .NET، لا يوجد مكون إضافي أو مكتبة لدعم الاتصالات بدون كلمة مرور. يمكنك الحصول على رمز وصول للهوية المدارة أو كيان الخدمة باستخدام مكتبة العميل مثل Azure.Identity. ثم يمكنك استخدام الرمز المميز للوصول ككلمة مرور للاتصال بقاعدة البيانات. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه.

using Azure.Core;
using Azure.Identity;
using MySqlConnector;

// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned managed identity.
// var credential = new DefaultAzureCredential();

// For user-assigned managed identity.
// var credential = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
//     });

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_MYSQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTSECRET");
// var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);

var tokenRequestContext = new TokenRequestContext(
    new[] { "https://ossrdbms-aad.database.windows.net/.default" });
AccessToken accessToken = await credential.GetTokenAsync(tokenRequestContext);
// Open a connection to the MySQL server using the access token.
string connectionString =
    $"{Environment.GetEnvironmentVariable("AZURE_MYSQL_CONNECTIONSTRING")};Password={accessToken.Token}";

using var connection = new MySqlConnection(connectionString);
Console.WriteLine("Opening connection using access token...");
await connection.OpenAsync();

// do something

لمزيد من نماذج التعليمات البرمجية، راجع الاتصال بقواعد بيانات Azure من App Service بدون أسرار باستخدام هوية مدارة.

  1. تثبيت التبعيات:

    dotnet add package Microsoft.Data.SqlClient
    
  2. احصل على سلسلة الاتصال قاعدة بيانات Azure SQL من متغير البيئة الذي تمت إضافته بواسطة Service Connector.

    using Microsoft.Data.SqlClient;
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    لمزيد من المعلومات، راجع استخدام مصادقة Active Directory Managed Identity.

لمزيد من المعلومات، راجع الصفحة الرئيسية لبرمجة العميل إلى Microsoft SQL Server.

نشر التطبيق إلى خدمة استضافة Azure

وأخيرا، انشر التطبيق الخاص بك إلى خدمة استضافة Azure. يمكن لخدمة المصدر هذه استخدام هوية مدارة للاتصال بقاعدة البيانات الهدف على Azure.

بالنسبة إلى Azure App Service، يمكنك التحقق من المستند لاختيار طريقة للنشر، راجع التشغيل السريع: نشر تطبيق ويب ASP.NET.

ثم يمكنك التحقق من السجل أو استدعاء التطبيق لمعرفة ما إذا كان يمكنه الاتصال بقاعدة بيانات Azure بنجاح.

استكشاف الأخطاء وإصلاحها

الإذن

إذا واجهت أي أخطاء متعلقة بالإذن، فتأكد من مستخدم Azure CLI الذي سجل الدخول باستخدام الأمر az account show. تأكد من تسجيل الدخول باستخدام الحساب الصحيح. بعد ذلك، تأكد من أن لديك الأذونات التالية التي قد تكون مطلوبة لإنشاء اتصال بدون كلمة مرور مع Service Connector.

الإذن العملية
Microsoft.DBforPostgreSQL/flexibleServers/read مطلوب للحصول على معلومات خادم قاعدة البيانات
Microsoft.DBforPostgreSQL/flexibleServers/write مطلوب لتمكين مصادقة Microsoft Entra لخادم قاعدة البيانات
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write مطلوب لإنشاء قاعدة جدار الحماية في حالة حظر عنوان IP المحلي
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete مطلوب للعودة إلى قاعدة جدار الحماية التي تم إنشاؤها بواسطة Service Connector لتجنب مشكلة الأمان
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read مطلوب للتحقق مما إذا كان مستخدم تسجيل الدخول إلى Azure CLI هو مسؤول خادم قاعدة بيانات Microsoft Entra
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write مطلوب لإضافة مستخدم تسجيل الدخول إلى Azure CLI كمسؤول Microsoft Entra لخادم قاعدة البيانات
الإذن العملية
Microsoft.DBforMySQL/flexibleServers/read مطلوب للحصول على معلومات خادم قاعدة البيانات
Microsoft.DBforMySQL/flexibleServers/write مطلوب لإضافة الهوية المدارة المعينة من قبل المستخدم إلى خادم قاعدة البيانات
Microsoft.DBforMySQL/flexibleServers/firewallRules/write مطلوب لإنشاء قاعدة جدار الحماية في حالة حظر عنوان IP المحلي
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete مطلوب للعودة إلى قاعدة جدار الحماية التي تم إنشاؤها بواسطة Service Connector لتجنب مشكلة الأمان
Microsoft.DBforMySQL/flexibleServers/administrators/read مطلوب للتحقق مما إذا كان مستخدم تسجيل الدخول إلى Azure CLI هو مسؤول خادم قاعدة بيانات Microsoft Entra
Microsoft.DBforMySQL/flexibleServers/administrators/write مطلوب لإضافة مستخدم تسجيل الدخول إلى Azure CLI كمسؤول Microsoft Entra لخادم قاعدة البيانات
الإذن العملية
Microsoft.Sql/servers/read مطلوب للحصول على معلومات خادم قاعدة البيانات
Microsoft.Sql/servers/firewallRules/write مطلوب لإنشاء قاعدة جدار الحماية في حالة حظر عنوان IP المحلي
Microsoft.Sql/servers/firewallRules/delete مطلوب للعودة إلى قاعدة جدار الحماية التي تم إنشاؤها بواسطة Service Connector لتجنب مشكلة الأمان
Microsoft.Sql/servers/administrators/read مطلوب للتحقق مما إذا كان مستخدم تسجيل الدخول إلى Azure CLI هو مسؤول خادم قاعدة بيانات Microsoft Entra
Microsoft.Sql/servers/administrators/write مطلوب لإضافة مستخدم تسجيل الدخول إلى Azure CLI كمسؤول Microsoft Entra لخادم قاعدة البيانات

في بعض الحالات، لا تكون الأذونات مطلوبة. على سبيل المثال، إذا كان المستخدم المصادق عليه من Azure CLI هو بالفعل مسؤول Active Directory على خادم SQL، فلن تحتاج إلى الحصول على Microsoft.Sql/servers/administrators/write الإذن.

Microsoft Entra ID

إذا تلقيت خطأ ERROR: AADSTS530003: Your device is required to be managed to access this resource.، فاطلب من قسم تكنولوجيا المعلومات المساعدة في الانضمام إلى هذا الجهاز إلى معرف Microsoft Entra. لمزيد من المعلومات، راجع الأجهزة المنضمة إلى Microsoft Entra.

يحتاج Service Connector إلى الوصول إلى معرف Microsoft Entra للحصول على معلومات عن حسابك والهوية المدارة لخدمة الاستضافة. يمكنك استخدام الأمر التالي للتحقق مما إذا كان جهازك يمكنه الوصول إلى معرف Microsoft Entra:

az ad signed-in-user show

إذا لم تقم بتسجيل الدخول بشكل تفاعلي، فقد تحصل أيضا على الخطأ و Interactive authentication is needed. لحل الخطأ، سجل الدخول باستخدام az login الأمر .

اتصال الشبكة

إذا كان خادم قاعدة البيانات الخاص بك في الشبكة الظاهرية، فتأكد من أن بيئتك التي تقوم بتشغيل أمر Azure CLI يمكنها الوصول إلى الخادم في الشبكة الظاهرية.

إذا كان خادم قاعدة البيانات الخاص بك في الشبكة الظاهرية، فتأكد من أن بيئتك التي تقوم بتشغيل أمر Azure CLI يمكنها الوصول إلى الخادم في الشبكة الظاهرية.

إذا تعذر على خادم قاعدة البيانات الوصول العام، فتأكد من أن بيئتك التي تقوم بتشغيل أمر Azure CLI يمكنها الوصول إلى الخادم من خلال نقطة النهاية الخاصة.

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

لمزيد من المعلومات حول Service Connector والاتصالات بدون كلمة مرور، راجع الموارد التالية: