Aracılığıyla paylaş


Öğretici: Hizmet Bağlayıcısı aracılığıyla veritabanı hizmetine parolasız bağlantı oluşturma

Parolasız bağlantılar, Azure hizmetlerine erişmek için yönetilen kimlikleri kullanır. Bu yaklaşımla yönetilen kimlikler için gizli dizileri el ile izlemeniz ve yönetmeniz gerekmez. Bu görevler Azure tarafından dahili olarak güvenli bir şekilde işlenir.

Hizmet Bağlayıcısı, Azure Spring Apps, Azure Uygulaması Service ve Azure Container Apps gibi uygulama barındırma hizmetlerinde yönetilen kimlikleri etkinleştirir. Hizmet Bağlayıcısı yönetilen kimlikleri kabul etmek için PostgreSQL için Azure Veritabanı, MySQL için Azure Veritabanı ve Azure SQL Veritabanı gibi veritabanı hizmetlerini de yapılandırıyor.

Bu öğreticide, aşağıdaki görevleri tamamlamak için Azure CLI'yi kullanacaksınız:

  • Azure CLI ile ilk ortamınızı denetleyin.
  • Service Connector ile parolasız bir bağlantı oluşturun.
  • Veritabanı hizmetine erişmek için Hizmet Bağlayıcısı tarafından oluşturulan ortam değişkenlerini veya yapılandırmaları kullanın.

Önkoşullar

Ortamınızı ayarlama

Firma

aracılığıyla az loginAzure CLI ile oturum açın. Azure Cloud Shell kullanıyorsanız veya zaten oturum açtıysanız ile kimliği doğrulanmış hesabınızı az account showonaylayın.

Hizmet Bağlayıcısı parolasız uzantısını yükleme

Azure CLI için en son Hizmet Bağlayıcısı parolasız uzantısını yükleyin:

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

Not

komutunu çalıştırarak az version"serviceconnector-passwordless" sürümünün "2.0.2" veya üzeri olduğunu denetleyin. Uzantı sürümünü yükseltmek için önce Azure CLI'yi yükseltmeniz gerekebilir.

Parolasız bağlantı oluşturma

Ardından yönetilen kimlik kullanarak bağlantı oluşturmak için örnek olarak Azure Uygulaması Hizmeti'ni kullanacağız.

Kullanıyorsanız:

  • Azure Spring Apps: bunun yerine kullanın az spring connection create . Daha fazla örnek için bkz . Azure Spring Apps'i Azure veritabanına bağlama.
  • Azure Container Apps: bunun yerine kullanın az containerapp connection create . Daha fazla örnek için bkz . Kimlik bağlantısı ile PostgreSQL veritabanı oluşturma ve bağlama.

Not

Azure portalını kullanıyorsanız Azure Uygulaması Service, Azure Spring Apps veya Azure Container Apps'in Hizmet Bağlayıcısı dikey penceresine gidin ve oluştur'u seçerek bağlantı oluşturun. Azure portalı sizin için komutu otomatik olarak oluşturur ve Cloud Shell'de komut yürütmeyi tetikler.

Aşağıdaki Azure CLI komutu bir --client-type parametre kullanır; java, dotnet, python vb. olabilir. Desteklenen istemci türlerini almak için komutunu az webapp connection create postgres-flexible -h çalıştırın ve uygulamanızla eşleşeni seçin.

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

MySQL için Azure Veritabanı - Esnek Sunucu, Microsoft Entra kimlik doğrulamasını etkinleştirmek için kullanıcı tarafından atanan bir yönetilen kimlik gerektirir. Daha fazla bilgi için bkz. MySQL için Azure Veritabanı - Esnek Sunucu için Microsoft Entra kimlik doğrulamasını ayarlama. Kullanıcı tarafından atanan bir yönetilen kimlik oluşturmak için aşağıdaki komutu kullanabilirsiniz:

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)

Önemli

Kullanıcı tarafından atanan yönetilen kimliği oluşturduktan sonra, Genel Yöneticinizden veya Ayrıcalıklı Rol Yöneticinizden bu kimlik için aşağıdaki izinleri vermesini isteyin:

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

Daha fazla bilgi için Active Directory kimlik doğrulamasının İzinler bölümüne bakın.

Ardından, Hizmet Bağlayıcısı'nı kullanarak sistem tarafından atanan yönetilen kimlikle uygulamanızı MySQL veritabanına bağlayın.

Aşağıdaki Azure CLI komutu bir --client-type parametre kullanır. az webapp connection create mysql-flexible -h Desteklenen istemci türlerini almak için komutunu çalıştırın ve uygulamanızla eşleşeni seçin.

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

Aşağıdaki Azure CLI komutu bir --client-type parametre kullanır. az webapp connection create sql -h Desteklenen istemci türlerini almak için komutunu çalıştırın ve uygulamanızla eşleşeni seçin.

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

Bu Hizmet Bağlayıcısı komutu arka planda aşağıdaki görevleri tamamlar:

  • Sistem tarafından atanan yönetilen kimliği etkinleştirin veya Azure Uygulaması Service/Azure Spring Apps/Azure Container Apps tarafından barındırılan uygulama $APPSERVICE_NAME için bir kullanıcı kimliği atayın.
  • Daha önce etkinleştirilmemişse veritabanı sunucusu için Microsoft Entra Kimlik Doğrulamasını etkinleştirin.
  • Microsoft Entra yöneticisini geçerli oturum açmış kullanıcı olarak ayarlayın.
  • Sistem tarafından atanan yönetilen kimlik, kullanıcı tarafından atanan yönetilen kimlik veya hizmet sorumlusu için veritabanı kullanıcısı ekleyin. Veritabanının $DATABASE_NAME tüm ayrıcalıklarını bu kullanıcıya verin. Kullanıcı adı, önceki komut çıkışındaki bağlantı dizesi bulunabilir.
  • veritabanı türüne göre , AZURE_POSTGRESQL_CONNECTIONSTRINGveya AZURE_SQL_CONNECTIONSTRING adlı AZURE_MYSQL_CONNECTIONSTRINGyapılandırmaları Azure kaynağına ayarlayın.
    • App Service için yapılandırmalar Uygulama Ayarları dikey penceresinde ayarlanır.
    • Spring Apps için yapılandırmalar, uygulama başlatıldığında ayarlanır.
    • Container Apps için yapılandırmalar ortam değişkenlerine ayarlanır. Azure portalındaki Hizmet Bağlayıcısı dikey penceresinde tüm yapılandırmaları ve bunların değerlerini alabilirsiniz.

Hizmet Bağlayıcısı kullanıcıya aşağıdaki ayrıcalıkları atar; bunları iptal edebilir ve gereksinimlerinize göre ayrıcalıkları ayarlayabilirsiniz.

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 kimlik doğrulaması ile veritabanına bağlanma

Bağlantıyı oluşturduktan sonra, Microsoft Entra kimlik doğrulaması ile veritabanına bağlanmak için uygulamanızdaki bağlantı dizesi kullanabilirsiniz. Örneğin, Microsoft Entra kimlik doğrulaması ile veritabanına bağlanmak için aşağıdaki çözümleri kullanabilirsiniz.

.NET için parolasız bağlantıları destekleyen bir eklenti veya kitaplık yoktur. Azure.Identity gibi istemci kitaplığını kullanarak yönetilen kimlik veya hizmet sorumlusu için erişim belirteci alabilirsiniz. Ardından veritabanına bağlanmak için parola olarak erişim belirtecini kullanabilirsiniz. Aşağıdaki kodu kullanırken, kullanmak istediğiniz kimlik doğrulama türü için kod parçacığının bölümünü açıklamayı kaldırın.

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();
}

Ardından, Hizmet Bağlayıcısı'nı kullanmadan önce PostgreSQL esnek sunucusunda tablolar ve diziler oluşturduysanız, sahip olarak bağlanmanız ve Hizmet Bağlayıcısı tarafından oluşturulma izni <aad-username> vermeniz gerekir. Hizmet Bağlayıcısı tarafından ayarlanan bağlantı dizesi veya yapılandırmadaki kullanıcı adı gibi aad_<connection name>görünmelidir. Azure portalını kullanıyorsanız sütunun yanındaki Service Type genişlet düğmesini seçin ve değeri alın. Azure CLI kullanıyorsanız CLI komut çıkışını denetleyin configurations .

Ardından, izin vermek için sorguyu yürütür

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> ve<owner-password>, başkalarına izin verebilen mevcut tablonun sahibidir. <aad-username> , Service Connector tarafından oluşturulan kullanıcıdır. Bunları gerçek değerle değiştirin.

Sonucu şu komutla doğrulayın:

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 için parolasız bağlantıları destekleyen bir eklenti veya kitaplık yoktur. Azure.Identity gibi istemci kitaplığını kullanarak yönetilen kimlik veya hizmet sorumlusu için erişim belirteci alabilirsiniz. Ardından veritabanına bağlanmak için parola olarak erişim belirtecini kullanabilirsiniz. Aşağıdaki kodu kullanırken, kullanmak istediğiniz kimlik doğrulama türü için kod parçacığının bölümünü açıklamayı kaldırın.

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

Daha fazla kod örneği için bkz . Yönetilen kimlik kullanarak gizli diziler olmadan App Service'ten Azure veritabanlarına bağlanma.

  1. Bağımlılıkları yükleyin.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Service Connector tarafından eklenen ortam değişkeninden Azure SQL Veritabanı bağlantı dizesi alın.

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

    Daha fazla bilgi için bkz . Active Directory Yönetilen Kimlik kimlik doğrulamasını kullanma.

Daha fazla bilgi için bkz . Microsoft SQL Server'da istemci programlama için Giriş sayfası.

Uygulamayı azure barındırma hizmetine dağıtma

Son olarak, uygulamanızı bir Azure barındırma hizmetine dağıtın. Bu kaynak hizmet, Azure'da hedef veritabanına bağlanmak için yönetilen kimlik kullanabilir.

Azure Uygulaması Hizmeti için, dağıtmanın bir yolunu seçmek için belgeyi denetleyebilirsiniz. Bkz. Hızlı Başlangıç: ASP.NET web uygulaması dağıtma.

Ardından günlüğü denetleyebilir veya azure veritabanına başarıyla bağlanıp bağlanamadığını görmek için uygulamayı çağırabilirsiniz.

Sorun giderme

İzin

İzinle ilgili hatalarla karşılaşırsanız, komutuyla az account showAzure CLI oturum açmış kullanıcısını onaylayın. Doğru hesapla oturum açtığınızdan emin olun. Ardından, Service Connector ile parolasız bağlantı oluşturmak için gerekli olabilecek aşağıdaki izinlere sahip olduğunuzu onaylayın.

İzin İşlem
Microsoft.DBforPostgreSQL/flexibleServers/read Veritabanı sunucusunun bilgilerini almak için gereklidir
Microsoft.DBforPostgreSQL/flexibleServers/write Veritabanı sunucusu için Microsoft Entra kimlik doğrulamasını etkinleştirmek için gereklidir
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write Yerel IP adresinin engellenmesi durumunda güvenlik duvarı kuralı oluşturmak için gereklidir
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete Güvenlik sorununu önlemek için Hizmet Bağlayıcısı tarafından oluşturulan güvenlik duvarı kuralını geri döndürmek için gereklidir
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read Azure CLI oturum açma kullanıcılarının bir veritabanı sunucusu Microsoft Entra yöneticisi olup olmadığını denetlemek için gereklidir
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write Azure CLI oturum açma kullanıcısını veritabanı sunucusu Microsoft Entra yöneticisi olarak eklemek için gereklidir
İzin İşlem
Microsoft.DBforMySQL/flexibleServers/read Veritabanı sunucusunun bilgilerini almak için gereklidir
Microsoft.DBforMySQL/flexibleServers/write Sağlanan Kullanıcı tarafından atanan yönetilen kimliği veritabanı sunucusuna eklemek için gereklidir
Microsoft.DBforMySQL/flexibleServers/firewallRules/write Yerel IP adresinin engellenmesi durumunda güvenlik duvarı kuralı oluşturmak için gereklidir
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete Güvenlik sorununu önlemek için Hizmet Bağlayıcısı tarafından oluşturulan güvenlik duvarı kuralını geri döndürmek için gereklidir
Microsoft.DBforMySQL/flexibleServers/administrators/read Azure CLI oturum açma kullanıcılarının bir veritabanı sunucusu Microsoft Entra yöneticisi olup olmadığını denetlemek için gereklidir
Microsoft.DBforMySQL/flexibleServers/administrators/write Azure CLI oturum açma kullanıcısını veritabanı sunucusu Microsoft Entra yöneticisi olarak eklemek için gereklidir
İzin İşlem
Microsoft.Sql/servers/read Veritabanı sunucusunun bilgilerini almak için gereklidir
Microsoft.Sql/servers/firewallRules/write Yerel IP adresinin engellenmesi durumunda güvenlik duvarı kuralı oluşturmak için gereklidir
Microsoft.Sql/servers/firewallRules/delete Güvenlik sorununu önlemek için Hizmet Bağlayıcısı tarafından oluşturulan güvenlik duvarı kuralını geri döndürmek için gereklidir
Microsoft.Sql/servers/administrators/read Azure CLI oturum açma kullanıcılarının bir veritabanı sunucusu Microsoft Entra yöneticisi olup olmadığını denetlemek için gereklidir
Microsoft.Sql/servers/administrators/write Azure CLI oturum açma kullanıcısını veritabanı sunucusu Microsoft Entra yöneticisi olarak eklemek için gereklidir

Bazı durumlarda izinler gerekli değildir. Örneğin, Azure CLI kimliği doğrulanmış kullanıcı zaten SQL server'da Active Directory Yöneticisiyse, izninizin Microsoft.Sql/servers/administrators/write olması gerekmez.

Microsoft Entra Kimlik

Hata ERROR: AADSTS530003: Your device is required to be managed to access this resource.alırsanız, bt departmanınızdan bu cihazı Microsoft Entra Id'ye ekleme konusunda yardım isteyin. Daha fazla bilgi için bkz . Microsoft Entra'ya katılmış cihazlar.

Hesabınızın ve barındırma hizmetinin yönetilen kimliğini almak için Hizmet Bağlayıcısı'nın Microsoft Entra Id'ye erişmesi gerekir. Cihazınızın Microsoft Entra Id'ye erişip erişemediğini denetlemek için aşağıdaki komutu kullanabilirsiniz:

az ad signed-in-user show

Etkileşimli olarak oturum açmazsanız ve Interactive authentication is neededhatasını da alabilirsiniz. Hatayı çözmek için komutuyla az login oturum açın.

Ağ bağlantısı

Veritabanı sunucunuz Sanal Ağ ise, Azure CLI komutunu çalıştıran ortamınızın Sanal Ağ sunucuya erişebildiğinden emin olun.

Veritabanı sunucunuz Sanal Ağ ise, Azure CLI komutunu çalıştıran ortamınızın Sanal Ağ sunucuya erişebildiğinden emin olun.

Veritabanı sunucunuz genel erişime izin vermiyorsa, Azure CLI komutunu çalıştıran ortamınızın özel uç nokta üzerinden sunucuya erişebildiğinden emin olun.

Sonraki adımlar

Hizmet Bağlayıcısı ve parolasız bağlantılar hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın: