Tutorial: Menyambungkan ke database Azure dari App Service tanpa rahasia menggunakan identitas terkelola
Artikel
Azure App Service menyediakan layanan hosting web yang sangat dapat diskalakan dan dapat melakukan patch sendiri. Ini juga memberikan identitas terkelola untuk aplikasi Anda, yang merupakan solusi penting untuk mengamankan akses ke database Azure, termasuk:
Identitas terkelola di App Service membuat aplikasi Anda lebih aman dengan menghilangkan rahasia dari aplikasi Anda, misalnya kredensial dalam string koneksi. Tutorial ini menunjukkan cara menyambungkan ke database yang disebutkan di atas dari App Service menggunakan identitas terkelola.
Apa yang akan Anda pelajari:
Konfigurasikan pengguna Microsoft Entra sebagai administrator untuk database Azure Anda.
Koneksi ke database Anda sebagai pengguna Microsoft Entra.
Konfigurasikan identitas terkelola yang ditetapkan sistem atau ditetapkan pengguna untuk aplikasi App Service.
Memberikan akses database ke identitas terkelola.
Sambungkan ke database Azure dari kode Anda (.NET Kerangka kerja 4.8, .NET 6, Node.js, Python, Java) menggunakan identitas terkelola.
Koneksi ke database Azure dari lingkungan pengembangan Anda menggunakan pengguna Microsoft Entra.
Buat aplikasi di App Service berdasarkan .NET, Node.js, Python, atau Java.
Buat server database dengan Azure SQL Database, Azure Database for MySQL, atau Azure Database for PostgreSQL.
Anda harus terbiasa dengan pola konektivitas standar (dengan nama pengguna dan kata sandi) dan dapat tersambung dengan sukses dari aplikasi App Service Anda ke database pilihan Anda.
Jika Anda lebih suka menjalankan perintah referensi CLI secara lokal, instal Azure CLI. Jika Anda menjalankan Windows atau macOS, pertimbangkan untuk menjalankan Azure CLI dalam kontainer Docker. Untuk informasi lebih lanjut, lihat Cara menjalankan Azure CLI di kontainer Docker.
Jika Anda menggunakan instalasi lokal, masuk ke Azure CLI dengan menggunakan perintah login az. Untuk menyelesaikan proses autentikasi, ikuti langkah-langkah yang ditampilkan di terminal Anda. Untuk opsi masuk lainnya, lihat Masuk dengan Azure CLI.
Saat Anda diminta, instal ekstensi Azure CLI pada penggunaan pertama. Untuk informasi selengkapnya tentang ekstensi, lihat Menggunakan ekstensi dengan Azure CLI.
Jalankan versi az untuk menemukan versi dan pustaka dependen yang diinstal. Untuk meningkatkan ke versi terbaru, jalankan peningkatan az.
1. Instal ekstensi Service Koneksi or passwordless
Instal ekstensi Service Koneksi or passwordless untuk Azure CLI:
az extension add --name serviceconnector-passwordless --upgrade
2. Buat koneksi tanpa kata sandi
Selanjutnya, buat koneksi tanpa kata sandi dengan Service Koneksi or.
Tip
portal Azure dapat membantu Anda menyusun perintah di bawah ini. Di portal Azure, buka sumber daya Azure App Service Anda, pilih Layanan Koneksi atau dari menu sebelah kiri dan pilih Buat. Isi formulir dengan semua parameter yang diperlukan. Azure automaticaly menghasilkan perintah pembuatan koneksi, yang dapat Anda salin untuk digunakan di CLI atau dijalankan di Azure Cloud Shell.
Untuk Azure Database for MySQL - Server Fleksibel, Anda harus terlebih dahulu menyiapkan autentikasi Microsoft Entra secara manual, yang memerlukan identitas terkelola terpisah yang ditetapkan pengguna dan izin Microsoft Graph tertentu. Langkah ini tidak dapat diotomatisasi.
Memberikan izin ke tabel yang telah dibuat sebelumnya
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
Perintah Service Koneksi or ini menyelesaikan tugas berikut di latar belakang:
Aktifkan identitas terkelola yang ditetapkan sistem, atau tetapkan identitas pengguna untuk aplikasi <server-name> yang dihosting oleh Azure App Service.
Atur admin Microsoft Entra ke pengguna yang masuk saat ini.
Tambahkan pengguna database untuk identitas terkelola yang ditetapkan sistem atau identitas terkelola yang ditetapkan pengguna. 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.
Jika Anda mengalami masalah saat membuat koneksi, lihat Pemecahan Masalah untuk mendapatkan bantuan.
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.
Tambahkan dependensi berikut dalam file pom.xml Anda:
Dapatkan konfigurasi koneksi Azure SQL Database dari variabel lingkungan yang ditambahkan oleh Service Koneksi or. Saat menggunakan kode di bawah ini, batalkan komentar bagian cuplikan kode untuk jenis autentikasi yang ingin Anda gunakan.
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') # The value should be 'ActiveDirectoryMsi'
# Uncomment the following lines according to the authentication type.
# For system-assigned managed identity.
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server={server},{port};Database={database};Authentication={authentication};Encrypt=yes;'
# For user-assigned managed identity.
# client_id = os.getenv('AZURE_SQL_USER')
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server={server},{port};Database={database};UID={client_id};Authentication={authentication};Encrypt=yes;'
conn = pyodbc.connect(connString)
Dapatkan konfigurasi koneksi Azure SQL Database dari variabel lingkungan yang ditambahkan oleh Koneksi or Layanan. Saat menggunakan kode di bawah ini, batalkan komentar bagian cuplikan kode untuk jenis autentikasi yang ingin Anda gunakan.
Koneksi ke Azure Database for MySQL dalam kode Anda mengikuti DefaultAzureCredential pola untuk semua tumpukan bahasa. DefaultAzureCredential cukup fleksibel untuk beradaptasi dengan lingkungan pengembangan dan lingkungan Azure. Saat berjalan secara lokal, pengguna Azure dapat diambil dari lingkungan pilihan Anda (Visual Studio, Visual Studio Code, Azure CLI, atau Azure PowerShell). Saat berjalan di Azure, identitas terkelola akan diambil. Jadi dimungkinkan untuk memiliki konektivitas ke database baik pada waktu pengembangan maupun dalam produksi. Polanya adalah sebagai berikut:
Membuat instans DefaultAzureCredential dari pustaka klien Azure Identity. Jika Anda menggunakan identitas yang ditetapkan pengguna, tentukan ID klien dari identitas tersebut.
Dapatkan token akses untuk Azure Database for MySQL: https://ossrdbms-aad.database.windows.net/.default.
Untuk .NET, dapatkan token akses untuk identitas terkelola menggunakan pustaka klien seperti Azure.Identity. Kemudian gunakan token akses sebagai kata sandi untuk menyambungkan ke database. Saat menggunakan kode di bawah ini, pastikan Anda membatalkan komentar bagian dari cuplikan kode yang sesuai dengan 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");
// });
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
Tambahkan dependensi berikut dalam file pom.xml Anda:
Autentikasi dengan token akses dari azure-identity pustaka. Dapatkan informasi koneksi dari variabel lingkungan yang ditambahkan oleh Koneksi or Layanan. Saat menggunakan kode di bawah ini, pastikan Anda membatalkan komentar bagian dari cuplikan kode yang sesuai dengan jenis autentikasi yang ingin Anda gunakan.
from azure.identity import ManagedIdentityCredential, ClientSecretCredential
import mysql.connector
import os
# Uncomment the following lines according to the authentication type.
# 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)
# 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()
Dapatkan token akses menggunakan @azure/identity dan informasi database Azure MySQL dari variabel lingkungan yang ditambahkan oleh Koneksi or Layanan. Saat menggunakan kode di bawah ini, pastikan Anda membatalkan komentar bagian dari cuplikan kode yang sesuai dengan jenis autentikasi yang ingin Anda gunakan.
import { DefaultAzureCredential,ClientSecretCredential } from "@azure/identity";
const mysql = require('mysql2');
// Uncomment the following lines according to the authentication type.
// 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
// });
// 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');
});
Koneksi ke Azure Database for PostgreSQL dalam kode Anda mengikuti DefaultAzureCredential pola untuk semua tumpukan bahasa. DefaultAzureCredential cukup fleksibel untuk beradaptasi dengan lingkungan pengembangan dan lingkungan Azure. Saat berjalan secara lokal, pengguna Azure dapat diambil dari lingkungan pilihan Anda (Visual Studio, Visual Studio Code, Azure CLI, atau Azure PowerShell). Saat berjalan di Azure, identitas terkelola akan diambil. Jadi dimungkinkan untuk memiliki konektivitas ke database baik pada waktu pengembangan maupun dalam produksi. Polanya adalah sebagai berikut:
Membuat instans DefaultAzureCredential dari pustaka klien Azure Identity. Jika Anda menggunakan identitas yang ditetapkan pengguna, tentukan ID klien dari identitas tersebut.
Dapatkan token akses untuk Azure Database for PostgreSQL: https://ossrdbms-aad.database.windows.net/.default.
Untuk .NET, dapatkan token akses untuk identitas terkelola menggunakan pustaka klien seperti Azure.Identity. Kemudian gunakan token akses sebagai kata sandi untuk menyambungkan ke database. Saat menggunakan kode di bawah ini, pastikan Anda membatalkan komentar bagian dari cuplikan kode yang sesuai dengan 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");
// }
// );
// 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();
}
Tambahkan dependensi berikut dalam file pom.xml Anda:
Autentikasi dengan token akses dari azure-identity pustaka dan gunakan token sebagai kata sandi. Dapatkan informasi koneksi dari variabel lingkungan yang ditambahkan oleh Koneksi or Layanan. Saat menggunakan kode di bawah ini, pastikan Anda membatalkan komentar bagian dari cuplikan kode yang sesuai dengan jenis autentikasi yang ingin Anda gunakan.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines according to the authentication type.
# 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)
# 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)
Dalam kode, dapatkan token akses melalui @azure/identity dan informasi koneksi PostgreSQL dari variabel lingkungan yang ditambahkan oleh layanan service Koneksi or. Gabungkan untuk membuat koneksi. Saat menggunakan kode di bawah ini, pastikan Anda membatalkan komentar bagian dari cuplikan kode yang sesuai dengan jenis autentikasi yang ingin Anda gunakan.
import { DefaultAzureCredential, ClientSecretCredential } from "@azure/identity";
const { Client } = require('pg');
// Uncomment the following lines according to the authentication type.
// 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
// });
// 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();
})();
Kode sampel ini menggunakan DefaultAzureCredential untuk mendapatkan token yang dapat digunakan untuk database Azure Anda dari ID Microsoft Entra lalu menambahkannya ke koneksi database. Saat Anda dapat menyesuaikan DefaultAzureCredential, secara default ini sudah sangat serbaguna. Ini mendapatkan token dari pengguna Microsoft Entra yang masuk atau dari identitas terkelola, tergantung pada apakah Anda menjalankannya secara lokal di lingkungan pengembangan Anda atau di App Service.
Tanpa perubahan lebih lanjut, kode Anda siap dijalankan di Azure. Namun, untuk men-debug kode Anda secara lokal, lingkungan pengembangan Anda memerlukan pengguna Microsoft Entra yang masuk. Dalam langkah ini, Anda mengonfigurasi lingkungan pilihan Anda dengan masuk dengan pengguna Microsoft Entra Anda.
Visual Studio untuk Windows terintegrasi dengan autentikasi Microsoft Entra. Untuk mengaktifkan pengembangan dan penelusuran kesalahan di Visual Studio, tambahkan pengguna Microsoft Entra Anda di Visual Studio dengan memilih Akun File>Pengaturan dari menu, dan pilih Masuk atau Tambahkan.
Untuk mengatur pengguna Microsoft Entra untuk autentikasi layanan Azure, pilih Opsi Alat>dari menu, lalu pilih Pilihan Akun Autentikasi>Layanan Azure. Pilih pengguna Microsoft Entra yang Anda tambahkan dan pilih OK.
Visual Studio untuk Mac tidak terintegrasi dengan autentikasi Microsoft Entra. Namun, pustaka klien Identitas Azure yang akan Anda gunakan nanti juga dapat mengambil token dari Azure CLI. Untuk mengaktifkan pengembangan dan penelusuran kesalahan di Visual Studio, instal Azure CLI di komputer lokal Anda.
Masuk ke Azure CLI dengan perintah berikut menggunakan pengguna Microsoft Entra Anda:
az login --allow-no-subscriptions
Visual Studio Code terintegrasi dengan autentikasi Microsoft Entra melalui ekstensi Azure. Instal ekstensi Alat Azure di Visual Studio Code.
Di Visual Studio Code, di Bilah Aktivitas, pilih ikon logo Azure.
Di penjelajah App Service, pilih Masuk ke Azure... dan ikuti petunjuknya.
Pustaka klien Identitas Azure yang akan Anda gunakan nanti dapat menggunakan token dari Azure CLI. Untuk mengaktifkan pengembangan berbasis baris perintah, instal Azure CLI di komputer lokal Anda.
Masuk ke Azure dengan perintah berikut menggunakan pengguna Microsoft Entra Anda:
az login --allow-no-subscriptions
Pustaka klien Identitas Azure yang akan Anda gunakan nanti dapat menggunakan token dari Azure PowerShell. Untuk mengaktifkan pengembangan berbasis baris perintah, instal Azure PowerShell di komputer lokal Anda.
Masuk ke Azure CLI dengan cmdlet berikut menggunakan pengguna Microsoft Entra Anda:
Connect-AzAccount
Untuk informasi selengkapnya tentang menyiapkan lingkungan pengembangan Anda untuk autentikasi Microsoft Entra, lihat Pustaka klien Azure Identity untuk .NET.
Anda sekarang siap untuk mengembangkan dan men-debug aplikasi Anda dengan SQL Database sebagai ujung belakang, menggunakan autentikasi Microsoft Entra.
5. Uji dan terbitkan
Jalankan kode Anda di lingkungan dev Anda. Kode Anda menggunakan pengguna Microsoft Entra yang masuk di lingkungan Anda untuk menyambungkan ke database back-end. Pengguna dapat mengakses database karena dikonfigurasi sebagai administrator Microsoft Entra untuk database.
Terbitkan kode Anda ke Azure menggunakan metode penerbitan pilihan. Di App Service, kode Anda menggunakan identitas terkelola aplikasi untuk tersambung ke database back-end.
ID Microsoft Entra dan identitas terkelola tidak didukung untuk SQL Server lokal.
Saya mendapatkan kesalahan Login failed for user '<token-identified principal>'.
Identitas terkelola yang Anda coba minta tokennya tidak diizinkan untuk mengakses database Azure.
Saya membuat perubahan pada autentikasi App Service atau pendaftaran aplikasi terkait. Mengapa saya masih mendapatkan token lama?
Layanan back-end identitas terkelola juga menjaga cache token yang memperbarui token untuk sumber daya target hanya saat habis masa berlakunya. Jika Anda mengubah konfigurasi setelah mencoba mendapatkan token dengan aplikasi, Anda sebenarnya tidak mendapatkan token baru dengan izin yang diperbarui hingga token yang di-cache habis masa berlakunya. Cara terbaik untuk mengatasinya adalah dengan menguji perubahan Anda dengan jendela InPrivate (Edge)/private (Safari)/Incognito (Chrome) baru. Dengan begitu, Anda pasti akan memulai dari sesi baru yang diautentikasi.
Bagaimana cara menambahkan identitas terkelola ke grup Microsoft Entra?
Jika mau, Anda dapat menambahkan identitas ke grup Microsoft Entra, lalu memberikan akses ke grup Microsoft Entra alih-alih identitas. Misalnya, perintah berikut menambahkan identitas terkelola dari langkah sebelumnya ke grup baru yang disebut myAzureSQLDBAccessGroup:
groupid=$(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group <group-name> --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
Untuk memberikan izin database untuk grup Microsoft Entra, lihat dokumentasi untuk jenis database masing-masing.
Saya mendapatkan kesalahan SSL connection is required. Please specify SSL options and retry.
Menyambungkan ke database Azure memerlukan pengaturan tambahan dan berada di luar cakupan tutorial ini. Untuk informasi lebih lanjut, lihat salah satu link berikut: