البرنامج التعليمي: إنشاء اتصال بدون كلمة مرور بخدمة قاعدة بيانات عبر 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 كمثال لإنشاء اتصال باستخدام الهوية المدارة.
Azure Container Apps: استخدم az containerapp connection create بدلا من ذلك. لمزيد من الأمثلة، راجع إنشاء قاعدة بيانات PostgreSQL وتوصيلها باتصال الهوية.
إشعار
إذا كنت تستخدم مدخل 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 للحصول على أنواع العملاء المدعومة، واختر النوع الذي يتطابق مع التطبيق الخاص بك.
Azure Database for MySQL - يتطلب الخادم المرن هوية مدارة يعينها المستخدم لتمكين مصادقة Microsoft Entra. لمزيد من المعلومات، راجع إعداد مصادقة Microsoft Entra لقاعدة بيانات Azure ل MySQL - الخادم المرن. يمكنك استخدام الأمر التالي لإنشاء هوية مدارة يعينها المستخدم:
بعد إنشاء الهوية المدارة المعينة من قبل المستخدم، اطلب من المسؤول العام أو مسؤول الدور المميز منح الأذونات التالية لهذه الهوية:
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 قم بتشغيل للحصول على أنواع العملاء المدعومة، واختر النوع الذي يطابق التطبيق الخاص بك.
يستخدم أمر Azure CLI التالي معلمة --client-type . az webapp connection create sql -h قم بتشغيل للحصول على أنواع العملاء المدعومة، واختر النوع الذي يطابق التطبيق الخاص بك.
يكمل أمر 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();
}
بالنسبة لتطبيق Spring، إذا قمت بإنشاء اتصال مع خيار --client-type springboot، يقوم Service Connector بتعيين الخصائص spring.datasource.azure.passwordless-enabledو spring.datasource.urlو و spring.datasource.username إلى Azure Spring Apps.
pip install azure-identity
pip install psycopg2-binary
pip freeze > requirements.txt # Save the dependencies to a file
احصل على الرمز المميز للوصول باستخدام azure-identity المكتبة واستخدم الرمز المميز ككلمة مرور. احصل على معلومات الاتصال من متغيرات البيئة المضافة بواسطة Service Connector. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned identity.
# cred = DefaultAzureCredential()
# For user-assigned identity.
# managed_identity_client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# For service principal.
# tenant_id = os.getenv('AZURE_POSTGRESQL_TENANTID')
# client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# client_secret = os.getenv('AZURE_POSTGRESQL_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# Acquire the access token
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
# Combine the token with the connection string from the environment variables added by Service Connector to establish the connection.
conn_string = os.getenv('AZURE_POSTGRESQL_CONNECTIONSTRING')
conn = psycopg2.connect(conn_string + ' password=' + accessToken.token)
تثبيت التبعيات:
pip install azure-identity
احصل على الرمز المميز للوصول باستخدام azure-identity المكتبة باستخدام متغيرات البيئة المضافة بواسطة Service Connector. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned identity.
# credential = DefaultAzureCredential()
# For user-assigned identity.
# managed_identity_client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# For service principal.
# tenant_id = os.getenv('AZURE_POSTGRESQL_TENANTID')
# client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# client_secret = os.getenv('AZURE_POSTGRESQL_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# Acquire the access token.
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
في ملف الإعداد، احصل على معلومات قاعدة بيانات Azure PostgreSQL من متغيرات البيئة المضافة بواسطة خدمة Service Connector. استخدم accessToken المكتسبة في الخطوة السابقة للوصول إلى قاعدة البيانات.
# In your setting file, eg. settings.py
host = os.getenv('AZURE_POSTGRESQL_HOST')
user = os.getenv('AZURE_POSTGRESQL_USER')
password = accessToken.token # this is accessToken acquired from above step.
database = os.getenv('AZURE_POSTGRESQL_NAME')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': database,
'USER': user,
'PASSWORD': password,
'HOST': host,
'PORT': '5432', # Port is 5432 by default
'OPTIONS': {'sslmode': 'require'},
}
}
تثبيت التبعيات:
go get github.com/lib/pq
go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
go get "github.com/Azure/azure-sdk-for-go/sdk/azcore"
في التعليمات البرمجية، احصل على الرمز المميز للوصول باستخدام azidentity، ثم استخدمه ككلمة مرور للاتصال ب Azure PostgreSQL جنبا إلى جنب مع معلومات الاتصال التي يوفرها Service Connector. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه.
import (
"database/sql"
"fmt"
"os"
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
_ "github.com/lib/pq"
)
// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// cred, err := azidentity.NewDefaultAzureCredential(nil)
// For user-assigned identity.
// clientid := os.Getenv("AZURE_POSTGRESQL_CLIENTID")
// azidentity.ManagedIdentityCredentialOptions.ID := clientid
// options := &azidentity.ManagedIdentityCredentialOptions{ID: clientid}
// cred, err := azidentity.NewManagedIdentityCredential(options)
// For service principal.
// clientid := os.Getenv("AZURE_POSTGRESQL_CLIENTID")
// tenantid := os.Getenv("AZURE_POSTGRESQL_TENANTID")
// clientsecret := os.Getenv("AZURE_POSTGRESQL_CLIENTSECRET")
// cred, err := azidentity.NewClientSecretCredential(tenantid, clientid, clientsecret, &azidentity.ClientSecretCredentialOptions{})
if err != nil {
// error handling
}
// Acquire the access token
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
token, err := cred.GetToken(ctx, policy.TokenRequestOptions{
Scopes: []string("https://ossrdbms-aad.database.windows.net/.default"),
})
// Combine the token with the connection string from the environment variables added by Service Connector to establish the connection.
connectionString := os.Getenv("AZURE_POSTGRESQL_CONNECTIONSTRING") + " password=" + token.Token
conn, err := sql.Open("postgres", connectionString)
if err != nil {
panic(err)
}
conn.Close()
في التعليمات البرمجية، احصل على الرمز المميز للوصول باستخدام @azure/identity معلومات اتصال PostgreSQL من متغيرات البيئة المضافة بواسطة خدمة Service Connector. قم بدمجها لتأسيس الاتصال. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه.
import { DefaultAzureCredential, ClientSecretCredential } from "@azure/identity";
const { Client } = require('pg');
// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// const credential = new DefaultAzureCredential();
// For user-assigned identity.
// const clientId = process.env.AZURE_POSTGRESQL_CLIENTID;
// const credential = new DefaultAzureCredential({
// managedIdentityClientId: clientId
// });
// For service principal.
// const tenantId = process.env.AZURE_POSTGRESQL_TENANTID;
// const clientId = process.env.AZURE_POSTGRESQL_CLIENTID;
// const clientSecret = process.env.AZURE_POSTGRESQL_CLIENTSECRET;
// Acquire the access token.
var accessToken = await credential.getToken('https://ossrdbms-aad.database.windows.net/.default');
// Use the token and the connection information from the environment variables added by Service Connector to establish the connection.
(async () => {
const client = new Client({
host: process.env.AZURE_POSTGRESQL_HOST,
user: process.env.AZURE_POSTGRESQL_USER,
password: accesstoken.token,
database: process.env.AZURE_POSTGRESQL_DATABASE,
port: Number(process.env.AZURE_POSTGRESQL_PORT) ,
ssl: process.env.AZURE_POSTGRESQL_SSL
});
await client.connect();
await client.end();
})();
بالنسبة إلى PHP، لا يوجد مكون إضافي أو مكتبة للاتصالات بدون كلمة مرور. يمكنك الحصول على رمز وصول للهوية المدارة أو كيان الخدمة واستخدامه ككلمة مرور للاتصال بقاعدة البيانات. يمكن الحصول على الرمز المميز للوصول باستخدام Azure REST API.
في التعليمات البرمجية، احصل على الرمز المميز للوصول باستخدام واجهة برمجة تطبيقات REST مع المكتبة المفضلة لديك.
بالنسبة للهوية المعينة من قبل المستخدم والهوية المعينة من قبل النظام، توفر App Service و Container Apps نقطة نهاية REST يمكن الوصول إليها داخليا لاسترداد الرموز المميزة للهويات المدارة عن طريق تحديد متغيرين للبيئة: IDENTITY_ENDPOINT و IDENTITY_HEADER. لمزيد من المعلومات، راجع مرجع نقطة نهاية REST.
احصل على الرمز المميز للوصول عن طريق إجراء طلب HTTP GET إلى نقطة نهاية الهوية، واستخدم https://ossrdbms-aad.database.windows.net كما resource في الاستعلام. بالنسبة للهوية المعينة من قبل المستخدم، يرجى تضمين معرف العميل من متغيرات البيئة المضافة بواسطة Service Connector في الاستعلام أيضا.
بالنسبة إلى كيان الخدمة، راجع طلب الرمز المميز للوصول من خدمة إلى خدمة Azure AD لمعرفة تفاصيل كيفية الحصول على الرمز المميز للوصول. جعل طلب POST نطاق https://ossrdbms-aad.database.windows.net/.default ومع معرف المستأجر ومعرف العميل وسر العميل لمدير الخدمة من متغيرات البيئة المضافة بواسطة Service Connector.
اجمع بين الرمز المميز للوصول واتصال PostgreSQL الذي يلدغ من متغيرات البيئة المضافة بواسطة خدمة Service Connector لإنشاء الاتصال.
بالنسبة إلى Ruby، لا يوجد مكون إضافي أو مكتبة للاتصالات بدون كلمة مرور. يمكنك الحصول على رمز وصول للهوية المدارة أو كيان الخدمة واستخدامه ككلمة مرور للاتصال بقاعدة البيانات. يمكن الحصول على الرمز المميز للوصول باستخدام Azure REST API.
تثبيت التبعيات:
gem install pg
في التعليمات البرمجية، احصل على الرمز المميز للوصول باستخدام REST API ومعلومات اتصال PostgreSQL من متغيرات البيئة المضافة بواسطة خدمة Service Connector. قم بدمجها لتأسيس الاتصال. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه.
توفر تطبيقات خدمة التطبيقات والحاويات نقطة نهاية REST يمكن الوصول إليها داخليا لاسترداد الرموز المميزة للهويات المدارة. لمزيد من المعلومات، راجع مرجع نقطة نهاية REST.
require 'pg'
require 'dotenv/load'
require 'net/http'
require 'json'
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned identity.
# uri = URI(ENV['IDENTITY_ENDPOINT'] + '?resource=https://ossrdbms-aad.database.windows.net&api-version=2019-08-01')
# res = Net::HTTP.get_response(uri, {'X-IDENTITY-HEADER' => ENV['IDENTITY_HEADER'], 'Metadata' => 'true'})
# For user-assigned identity.
# uri = URI(ENV[IDENTITY_ENDPOINT] + '?resource=https://ossrdbms-aad.database.windows.net&api-version=2019-08-01&client-id=' + ENV['AZURE_POSTGRESQL_CLIENTID'])
# res = Net::HTTP.get_response(uri, {'X-IDENTITY-HEADER' => ENV['IDENTITY_HEADER'], 'Metadata' => 'true'})
# For service principal
# uri = URI('https://login.microsoftonline.com/' + ENV['AZURE_POSTGRESQL_TENANTID'] + '/oauth2/v2.0/token')
# params = {
# :grant_type => 'client_credentials',
# :client_id: => ENV['AZURE_POSTGRESQL_CLIENTID'],
# :client_secret => ENV['AZURE_POSTGRESQL_CLIENTSECRET'],
# :scope => 'https://ossrdbms-aad.database.windows.net/.default'
# }
# req = Net::HTTP::POST.new(uri)
# req.set_form_data(params)
# req['Content-Type'] = 'application/x-www-form-urlencoded'
# res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => true) do |http|
# http.request(req)
parsed = JSON.parse(res.body)
access_token = parsed["access_token"]
# Use the token and the connection string from the environment variables added by Service Connector to establish the connection.
conn = PG::Connection.new(
connection_string: ENV['AZURE_POSTGRESQL_CONNECTIONSTRING'] + " password=" + access_token,
)
راجع طلب الرمز المميز للوصول من خدمة إلى خدمة Azure AD للاطلاع على مزيد من التفاصيل حول كيفية الحصول على رمز الوصول المميز لكيان الخدمة.
بعد ذلك، إذا قمت بإنشاء جداول وتسلسلات في خادم 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
بالنسبة لتطبيق Spring، إذا قمت بإنشاء اتصال مع خيار --client-type springboot، يقوم Service Connector بتعيين الخصائص spring.datasource.azure.passwordless-enabledو spring.datasource.urlو و spring.datasource.username إلى Azure Spring Apps.
المصادقة باستخدام رمز الوصول المميز الحصول على عبر azure-identity المكتبة والحصول على معلومات الاتصال من متغير البيئة المضافة بواسطة Service Connector. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه.
from azure.identity import ManagedIdentityCredential, ClientSecretCredential
import mysql.connector
import os
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned managed identity.
# cred = ManagedIdentityCredential()
# For user-assigned managed identity.
# managed_identity_client_id = os.getenv('AZURE_MYSQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# For service principal
# tenant_id = os.getenv('AZURE_MYSQL_TENANTID')
# client_id = os.getenv('AZURE_MYSQL_CLIENTID')
# client_secret = os.getenv('AZURE_MYSQL_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# acquire token
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
# open connect to Azure MySQL with the access token.
host = os.getenv('AZURE_MYSQL_HOST')
database = os.getenv('AZURE_MYSQL_NAME')
user = os.getenv('AZURE_MYSQL_USER')
password = accessToken.token
cnx = mysql.connector.connect(user=user,
password=password,
host=host,
database=database)
cnx.close()
تثبيت التبعيات:
pip install azure-identity
احصل على الرمز المميز للوصول عبر azure-identity المكتبة مع متغيرات البيئة المضافة بواسطة Service Connector. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه.
from azure.identity import ManagedIdentityCredential, ClientSecretCredential
import os
# Uncomment the following lines corresponding to the authentication type you want to use.
# system-assigned managed identity
# cred = ManagedIdentityCredential()
# user-assigned managed identity
# managed_identity_client_id = os.getenv('AZURE_MYSQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# service principal
# tenant_id = os.getenv('AZURE_MYSQL_TENANTID')
# client_id = os.getenv('AZURE_MYSQL_CLIENTID')
# client_secret = os.getenv('AZURE_MYSQL_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# acquire token
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
في إعداد الملف، احصل على معلومات قاعدة بيانات Azure MySQL من متغيرات البيئة المضافة بواسطة خدمة Service Connector. استخدم accessToken المكتسبة في الخطوة السابقة للوصول إلى قاعدة البيانات.
# in your setting file, eg. settings.py
host = os.getenv('AZURE_MYSQL_HOST')
database = os.getenv('AZURE_MYSQL_NAME')
user = os.getenv('AZURE_MYSQL_USER')
password = accessToken.token # this is accessToken acquired from above step.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': database,
'USER': user,
'PASSWORD': password,
'HOST': host
}
}
تثبيت التبعيات:
go get "github.com/go-sql-driver/mysql"
go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
go get "github.com/Azure/azure-sdk-for-go/sdk/azcore"
في التعليمات البرمجية، احصل على الرمز المميز للوصول عبر azidentity، ثم اتصل ب Azure MySQL باستخدام الرمز المميز. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه.
import (
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/go-sql-driver/mysql"
)
func main() {
// Uncomment the following lines corresponding to the authentication type you want to use.
// for system-assigned managed identity
// cred, err := azidentity.NewDefaultAzureCredential(nil)
// for user-assigned managed identity
// clientid := os.Getenv("AZURE_MYSQL_CLIENTID")
// azidentity.ManagedIdentityCredentialOptions.ID := clientid
// options := &azidentity.ManagedIdentityCredentialOptions{ID: clientid}
// cred, err := azidentity.NewManagedIdentityCredential(options)
// for service principal
// clientid := os.Getenv("AZURE_MYSQL_CLIENTID")
// tenantid := os.Getenv("AZURE_MYSQL_TENANTID")
// clientsecret := os.Getenv("AZURE_MYSQL_CLIENTSECRET")
// cred, err := azidentity.NewClientSecretCredential(tenantid, clientid, clientsecret, &azidentity.ClientSecretCredentialOptions{})
if err != nil {
}
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
token, err := cred.GetToken(ctx, policy.TokenRequestOptions{
Scopes: []string("https://ossrdbms-aad.database.windows.net/.default"),
})
connectionString := os.Getenv("AZURE_MYSQL_CONNECTIONSTRING") + ";Password=" + token.Token
db, err := sql.Open("mysql", connectionString)
}
احصل على الرمز المميز للوصول باستخدام @azure/identity ومعلومات قاعدة بيانات Azure MySQL من متغيرات البيئة المضافة بواسطة خدمة Service Connector. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه.
import { DefaultAzureCredential,ClientSecretCredential } from "@azure/identity";
const mysql = require('mysql2');
// Uncomment the following lines corresponding to the authentication type you want to use.
// for system-assigned managed identity
// const credential = new DefaultAzureCredential();
// for user-assigned managed identity
// const clientId = process.env.AZURE_MYSQL_CLIENTID;
// const credential = new DefaultAzureCredential({
// managedIdentityClientId: clientId
// });
// for service principal
// const tenantId = process.env.AZURE_MYSQL_TENANTID;
// const clientId = process.env.AZURE_MYSQL_CLIENTID;
// const clientSecret = process.env.AZURE_MYSQL_CLIENTSECRET;
// const credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
// acquire token
var accessToken = await credential.getToken('https://ossrdbms-aad.database.windows.net/.default');
const connection = mysql.createConnection({
host: process.env.AZURE_MYSQL_HOST,
user: process.env.AZURE_MYSQL_USER,
password: accessToken.token,
database: process.env.AZURE_MYSQL_DATABASE,
port: process.env.AZURE_MYSQL_PORT,
ssl: process.env.AZURE_MYSQL_SSL
});
connection.connect((err) => {
if (err) {
console.error('Error connecting to MySQL database: ' + err.stack);
return;
}
console.log('Connected to MySQL database');
});
بالنسبة للغات الأخرى، استخدم سلسلة الاتصال واسم المستخدم الذي يعينه Service Connector إلى متغيرات البيئة لتوصيل قاعدة البيانات. للحصول على تفاصيل متغير البيئة، راجع دمج قاعدة بيانات Azure ل MySQL مع Service Connector.
بالنسبة للغات الأخرى، استخدم سلسلة الاتصال واسم المستخدم الذي يعينه Service Connector إلى متغيرات البيئة لتوصيل قاعدة البيانات. للحصول على تفاصيل متغير البيئة، راجع دمج قاعدة بيانات Azure ل MySQL مع Service Connector.
بالنسبة للغات الأخرى، استخدم خصائص الاتصال التي يعينها Service Connector إلى متغيرات البيئة لتوصيل قاعدة البيانات. للحصول على تفاصيل متغير البيئة، راجع دمج قاعدة بيانات Azure ل MySQL مع Service Connector.
احصل على سلسلة الاتصال قاعدة بيانات 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.
احصل على سلسلة الاتصال قاعدة بيانات Azure SQL من متغير البيئة الذي تمت إضافته بواسطة Service Connector.
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
public class Main {
public static void main(String[] args) {
// AZURE_SQL_CONNECTIONSTRING should be one of the following:
// For system-assigned managed identity: "jdbc:sqlserver://{SQLName}.database.windows.net:1433;databaseName={SQLDbName};authentication=ActiveDirectoryMSI;"
// For user-assigned managed identity: "jdbc:sqlserver://{SQLName}.database.windows.net:1433;databaseName={SQLDbName};msiClientId={UserAssignedMiClientId};authentication=ActiveDirectoryMSI;"
// For service principal: "jdbc:sqlserver://{SQLName}.database.windows.net:1433;databaseName={SQLDbName};user={ServicePrincipalClientId};password={spSecret};authentication=ActiveDirectoryServicePrincipal;"
String connectionString = System.getenv("AZURE_SQL_CONNECTIONSTRING");
SQLServerDataSource ds = new SQLServerDataSource();
ds.setURL(connectionString);
try (Connection connection = ds.getConnection()) {
System.out.println("Connected successfully.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
بالنسبة لتطبيق Spring، إذا قمت بإنشاء اتصال مع خيار --client-type springboot، يقوم Service Connector بتعيين الخصائص spring.datasource.url بتنسيق jdbc:sqlserver://<sql-server>.database.windows.net:1433;databaseName=<sql-db>;authentication=ActiveDirectoryMSI; القيمة إلى Azure Spring Apps.
احصل على تكوينات اتصال قاعدة بيانات Azure SQL من متغير البيئة المضافة بواسطة Service Connector. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه. إذا كنت تستخدم Azure Container Apps كخدمة حساب أو سلسلة الاتصال في مقتطف التعليمات البرمجية لا يعمل، فراجع ترحيل تطبيق Python لاستخدام اتصالات بدون كلمة مرور مع قاعدة بيانات Azure SQL للاتصال بقاعدة بيانات Azure SQL باستخدام رمز مميز للوصول.
import os
import pyodbc
server = os.getenv('AZURE_SQL_SERVER')
port = os.getenv('AZURE_SQL_PORT')
database = os.getenv('AZURE_SQL_DATABASE')
authentication = os.getenv('AZURE_SQL_AUTHENTICATION')
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned managed identity.
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server=tcp:{server},{port};Database={database};Authentication={authentication};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30'
# For user-assigned managed identity.
# clientID = os.getenv('AZURE_SQL_USER')
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server=tcp:{server},{port};Database={database};UID={clientID};Authentication={authentication};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30'
# For service principal.
# user = os.getenv('AZURE_SQL_USER')
# password = os.getenv('AZURE_SQL_PASSWORD')
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server=tcp:{server},{port};Database={database};UID={user};PWD={password};Authentication={authentication};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30'
conn = pyodbc.connect(connString)
تثبيت التبعيات:
npm install mssql
احصل على تكوينات اتصال قاعدة بيانات Azure SQL من متغيرات البيئة المضافة بواسطة Service Connector. عند استخدام التعليمات البرمجية أدناه، قم بإلغاء التعليق على جزء مقتطف التعليمات البرمجية لنوع المصادقة الذي تريد استخدامه.
بالنسبة للغات الأخرى، استخدم خصائص الاتصال التي يعينها Service Connector إلى متغيرات البيئة لتوصيل قاعدة البيانات. للحصول على تفاصيل متغير البيئة، راجع دمج قاعدة بيانات Azure SQL مع موصل الخدمة.
بالنسبة إلى Azure App Service، يمكنك التحقق من المستند لاختيار طريقة للنشر، راجع التشغيل السريع: نشر تطبيق ويب ASP.NET.
بالنسبة إلى Azure Spring Apps، يمكنك التحقق من المستند لمزيد من التفاصيل حول إنشاء التطبيق والنشر، راجع إنشاء التطبيق ونشره.
بالنسبة إلى Azure Container Apps، يمكنك التحقق من المستند حول كيفية نشر تطبيقك، راجع التشغيل السريع: نشر تطبيق الحاوية الأول.
ثم يمكنك التحقق من السجل أو استدعاء التطبيق لمعرفة ما إذا كان يمكنه الاتصال بقاعدة بيانات Azure بنجاح.
استكشاف الأخطاء وإصلاحها
الإذن
إذا واجهت أي أخطاء متعلقة بالإذن، فتأكد من مستخدم Azure CLI الذي سجل الدخول باستخدام الأمر az account show. تأكد من تسجيل الدخول باستخدام الحساب الصحيح. بعد ذلك، تأكد من أن لديك الأذونات التالية التي قد تكون مطلوبة لإنشاء اتصال بدون كلمة مرور مع Service Connector.
الإذن
العملية
Microsoft.DBforPostgreSQL/flexibleServers/read
مطلوب للحصول على معلومات خادم قاعدة البيانات
Microsoft.DBforPostgreSQL/flexibleServers/write
مطلوب لتمكين مصادقة Microsoft Entra لخادم قاعدة البيانات
مطلوب لإضافة مستخدم تسجيل الدخول إلى 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 والاتصالات بدون كلمة مرور، راجع الموارد التالية: