Tutorial: Membuat koneksi tanpa kata sandi ke layanan database melalui Koneksi or Layanan

Koneksi tanpa kata sandi menggunakan identitas terkelola untuk mengakses layanan Azure. Dengan pendekatan ini, Anda tidak perlu melacak dan mengelola rahasia secara manual untuk identitas terkelola. Tugas-tugas ini ditangani dengan aman secara internal oleh Azure.

Service Koneksi or memungkinkan identitas terkelola di layanan hosting aplikasi seperti Azure Spring Apps, Azure App Service, dan Azure Container Apps. Service Koneksi or juga mengonfigurasi layanan database, seperti Azure Database for PostgreSQL, Azure Database for MySQL, dan Azure SQL Database, untuk menerima identitas terkelola.

Di tutorial ini, Anda menggunakan Azure CLI untuk menyelesaikan tugas berikut:

  • Periksa lingkungan awal Anda dengan Azure CLI.
  • Buat koneksi tanpa kata sandi dengan Service Koneksi or.
  • Gunakan variabel lingkungan atau konfigurasi yang dihasilkan oleh Service Koneksi or untuk mengakses layanan database.

Prasyarat

Menyiapkan lingkungan Anda

Akun

Masuk dengan Azure CLI melalui az login. Jika Anda menggunakan Azure Cloud Shell atau sudah masuk, konfirmasikan akun terautentikasi Anda dengan az account show.

Instal ekstensi Service Koneksi or passwordless

Instal ekstensi Service Koneksi or passwordless untuk Azure CLI:

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

Membuat koneksi tanpa kata sandi

Selanjutnya, kami menggunakan Azure App Service sebagai contoh untuk membuat koneksi menggunakan identitas terkelola.

Jika Anda menggunakan:

Catatan

Jika Anda menggunakan portal Azure, buka bilah Service Koneksi or Azure App Service, Azure Spring Apps, atau Azure Container Apps, dan pilih Buat untuk membuat koneksi. portal Azure akan secara otomatis menyusun perintah untuk Anda dan memicu eksekusi perintah di Cloud Shell.

Perintah Azure CLI berikut menggunakan --client-type parameter . Jalankan az webapp connection create postgres-flexible -h untuk mendapatkan jenis klien yang didukung, dan pilih yang cocok dengan aplikasi Anda.

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 java

Azure Database for MySQL - Server Fleksibel memerlukan identitas terkelola yang ditetapkan pengguna untuk mengaktifkan autentikasi Microsoft Entra. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi Microsoft Entra untuk Azure Database for MySQL - Server Fleksibel. Anda dapat menggunakan perintah berikut untuk membuat identitas terkelola yang ditetapkan pengguna:

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)

Penting

Setelah membuat identitas terkelola yang ditetapkan pengguna, minta Administrator Global atau Administrator Peran Istimewa Anda untuk memberikan izin berikut untuk identitas ini:

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

Untuk informasi selengkapnya, lihat bagian Izin autentikasi Direktori Aktif.

Kemudian, sambungkan aplikasi Anda ke database MySQL dengan identitas terkelola yang ditetapkan sistem menggunakan Service Koneksi or.

Perintah Azure CLI berikut menggunakan --client-type parameter . Jalankan az webapp connection create mysql-flexible -h untuk mendapatkan jenis klien yang didukung, dan pilih yang cocok dengan aplikasi Anda.

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

Perintah Azure CLI berikut menggunakan --client-type parameter . Jalankan az webapp connection create sql -h untuk mendapatkan jenis klien yang didukung, dan pilih yang cocok dengan aplikasi Anda.

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

Perintah Service Koneksi or ini menyelesaikan tugas berikut di latar belakang:

  • Aktifkan identitas terkelola yang ditetapkan sistem, atau tetapkan identitas pengguna untuk aplikasi $APPSERVICE_NAME yang dihosting oleh Azure App Service/Azure Spring Apps/Azure Container Apps.
  • Atur admin Microsoft Entra ke pengguna yang masuk saat ini.
  • Tambahkan pengguna database untuk identitas terkelola yang ditetapkan sistem, identitas terkelola yang ditetapkan pengguna, atau perwakilan layanan. Berikan semua hak istimewa database $DATABASE_NAME kepada pengguna ini. Nama pengguna dapat ditemukan di string koneksi dalam output perintah sebelumnya.
  • Atur konfigurasi bernama AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRING, atau AZURE_SQL_CONNECTIONSTRING ke sumber daya Azure berdasarkan jenis database.
    • Untuk App Service, konfigurasi diatur di bilah App Pengaturan.
    • Untuk Spring Apps, konfigurasi diatur saat aplikasi diluncurkan.
    • Untuk Container Apps, konfigurasi diatur ke variabel lingkungan. Anda bisa mendapatkan semua konfigurasi dan nilainya di bilah Service Koneksi or di portal Azure.

Koneksi ke database dengan autentikasi Microsoft Entra

Setelah membuat koneksi, Anda dapat menggunakan string koneksi di aplikasi Anda untuk menyambungkan ke database dengan autentikasi Microsoft Entra. Misalnya, Anda dapat menggunakan solusi berikut untuk menyambungkan ke database dengan autentikasi Microsoft Entra.

Untuk .NET, tidak ada plugin atau pustaka untuk mendukung koneksi tanpa kata sandi. Anda bisa mendapatkan token akses untuk identitas terkelola atau perwakilan layanan menggunakan pustaka klien seperti Azure.Identity. Kemudian Anda dapat menggunakan token akses sebagai kata sandi untuk menyambungkan ke database. Saat menggunakan kode di bawah ini, batalkan komentar bagian cuplikan kode untuk jenis autentikasi yang ingin Anda gunakan.

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

// Uncomment the following lines according to the authentication type.
// 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();
}

Selanjutnya, jika Anda telah membuat tabel dan urutan di server fleksibel PostgreSQL sebelum menggunakan Service Koneksi or, Anda perlu terhubung sebagai pemilik dan memberikan izin untuk <aad-username> dibuat oleh Service Koneksi or. Nama pengguna dari string koneksi atau konfigurasi yang ditetapkan oleh Service Koneksi or akan terlihat seperti aad_<connection name>. Jika Anda menggunakan portal Azure, pilih tombol perluas di Service Type samping kolom dan dapatkan nilainya. Jika Anda menggunakan Azure CLI, periksa configurations output perintah CLI.

Kemudian, jalankan kueri untuk memberikan izin

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> dan <owner-password> adalah pemilik tabel yang ada yang dapat memberikan izin kepada orang lain. <aad-username>adalah pengguna yang dibuat oleh Service Koneksi or. Ganti dengan nilai aktual.

Validasi hasil dengan perintah :

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

Untuk .NET, tidak ada plugin atau pustaka untuk mendukung koneksi tanpa kata sandi. Anda bisa mendapatkan token akses untuk identitas terkelola atau perwakilan layanan menggunakan pustaka klien seperti Azure.Identity. Kemudian Anda dapat menggunakan token akses sebagai kata sandi untuk menyambungkan ke database. Saat menggunakan kode di bawah ini, batalkan komentar bagian cuplikan kode untuk jenis autentikasi yang ingin Anda gunakan.

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

// Uncomment the following lines according to the authentication type.
// 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

Untuk sampel kode lainnya, lihat Koneksi ke database Azure dari App Service tanpa rahasia menggunakan identitas terkelola.

  1. Instal dependensi.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Dapatkan string koneksi Azure SQL Database dari variabel lingkungan yang ditambahkan oleh Koneksi or Layanan.

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

    Untuk informasi selengkapnya, lihat Menggunakan autentikasi Identitas Terkelola Direktori Aktif.

Untuk informasi selengkapnya, lihat Beranda untuk pemrograman klien ke Microsoft SQL Server.

Menyebarkan aplikasi ke layanan hosting Azure

Terakhir, sebarkan aplikasi Anda ke layanan hosting Azure. Layanan sumber tersebut dapat menggunakan identitas terkelola untuk menyambungkan ke database target di Azure.

Untuk Azure App Service, Anda dapat menyebarkan kode aplikasi melalui az webapp deploy perintah . Untuk mendapatkan informasi selengkapnya, lihat Mulai Cepat: Menyebarkan aplikasi web ASP.NET.

Kemudian Anda dapat memeriksa log atau memanggil aplikasi untuk melihat apakah aplikasi dapat berhasil tersambung ke database Azure.

Pemecahan Masalah

Izin

Jika Anda mengalami kesalahan terkait izin, konfirmasikan pengguna masuk Azure CLI dengan perintah az account show. Pastikan Anda masuk dengan akun yang benar. Selanjutnya, konfirmasikan bahwa Anda memiliki izin berikut yang mungkin diperlukan untuk membuat koneksi tanpa kata sandi dengan Service Koneksi or.

Izin Operasi
Microsoft.DBforPostgreSQL/flexibleServers/read Diperlukan untuk mendapatkan informasi server database
Microsoft.DBforPostgreSQL/flexibleServers/write Diperlukan untuk mengaktifkan autentikasi Microsoft Entra untuk server database
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write Diperlukan untuk membuat aturan firewall jika alamat IP lokal diblokir
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete Diperlukan untuk mengembalikan aturan firewall yang dibuat oleh service Koneksi or untuk menghindari masalah keamanan
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read Diperlukan untuk memeriksa apakah pengguna login Azure CLI adalah administrator Microsoft Entra server database
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write Diperlukan untuk menambahkan pengguna masuk Azure CLI sebagai administrator Microsoft Entra server database
Izin Operasi
Microsoft.DBforMySQL/flexibleServers/read Diperlukan untuk mendapatkan informasi server database
Microsoft.DBforMySQL/flexibleServers/write Diperlukan untuk menambahkan identitas terkelola yang ditetapkan Pengguna yang disediakan ke server database
Microsoft.DBforMySQL/flexibleServers/firewallRules/write Diperlukan untuk membuat aturan firewall jika alamat IP lokal diblokir
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete Diperlukan untuk mengembalikan aturan firewall yang dibuat oleh service Koneksi or untuk menghindari masalah keamanan
Microsoft.DBforMySQL/flexibleServers/administrators/read Diperlukan untuk memeriksa apakah pengguna login Azure CLI adalah administrator Microsoft Entra server database
Microsoft.DBforMySQL/flexibleServers/administrators/write Diperlukan untuk menambahkan pengguna masuk Azure CLI sebagai administrator Microsoft Entra server database
Izin Operasi
Microsoft.Sql/servers/read Diperlukan untuk mendapatkan informasi server database
Microsoft.Sql/servers/firewallRules/write Diperlukan untuk membuat aturan firewall jika alamat IP lokal diblokir
Microsoft.Sql/servers/firewallRules/delete Diperlukan untuk mengembalikan aturan firewall yang dibuat oleh service Koneksi or untuk menghindari masalah keamanan
Microsoft.Sql/servers/administrators/read Diperlukan untuk memeriksa apakah pengguna login Azure CLI adalah administrator Microsoft Entra server database
Microsoft.Sql/servers/administrators/write Diperlukan untuk menambahkan pengguna masuk Azure CLI sebagai administrator Microsoft Entra server database

Dalam beberapa kasus, izin tidak diperlukan. Misalnya, jika pengguna yang diautentikasi Azure CLI sudah menjadi Administrator Direktori Aktif di server SQL, Anda tidak perlu memiliki Microsoft.Sql/servers/administrators/write izin.

Microsoft Entra ID

Jika Anda mendapatkan kesalahan ERROR: AADSTS530003: Your device is required to be managed to access this resource., minta bantuan departemen IT Anda untuk bergabung dengan perangkat ini ke ID Microsoft Entra. Untuk informasi selengkapnya, lihat Perangkat gabungan Microsoft Entra.

Koneksi layanan perlu mengakses ID Microsoft Entra untuk mendapatkan informasi tentang akun Anda dan identitas layanan hosting terkelola Anda. Anda dapat menggunakan perintah berikut untuk memeriksa apakah perangkat Anda dapat mengakses ID Microsoft Entra:

az ad signed-in-user show

Jika Anda tidak masuk secara interaktif, Anda mungkin juga mendapatkan kesalahan dan Interactive authentication is needed. Untuk mengatasi kesalahan, masuk dengan az login perintah .

Konektivitas jaringan

Jika server database Anda berada di Virtual Network, pastikan lingkungan Anda yang menjalankan perintah Azure CLI dapat mengakses server di Virtual Network.

Jika server database Anda berada di Virtual Network, pastikan lingkungan Anda yang menjalankan perintah Azure CLI dapat mengakses server di Virtual Network.

Jika server database Anda melarang akses publik, pastikan lingkungan Anda yang menjalankan perintah Azure CLI dapat mengakses server melalui titik akhir privat.

Langkah berikutnya

Untuk informasi selengkapnya tentang Koneksi Layanan dan koneksi tanpa kata sandi, lihat sumber daya berikut ini: