Tutorial: Membuat koneksi tanpa kata sandi ke layanan database melalui Koneksi or Layanan
Artikel
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.
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:
Azure Spring Apps: gunakan az spring connection create sebagai gantinya. Untuk contoh selengkapnya, lihat Koneksi Azure Spring Apps ke database Azure.
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.
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:
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.
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.
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();
}
Tambahkan dependensi berikut dalam file pom.xml Anda:
Untuk aplikasi Spring, jika Anda membuat koneksi dengan opsi --client-type springboot, Service Koneksi or mengatur properti spring.datasource.azure.passwordless-enabled, spring.datasource.url, dan spring.datasource.username ke Azure Spring Apps.
Dapatkan token akses menggunakan azure-identity pustaka dan gunakan token sebagai kata sandi. Dapatkan informasi koneksi 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.
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)
# 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)
Instal dependensi.
pip install azure-identity
Dapatkan token akses menggunakan azure-identity pustaka menggunakan 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.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines according to the authentication type.
# 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')
Dalam mengatur file, dapatkan informasi database Azure PostgreSQL dari variabel lingkungan yang ditambahkan oleh layanan Koneksi or Layanan. Gunakan accessToken yang diperoleh pada langkah sebelumnya untuk mengakses database.
# 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'},
}
}
Instal dependensi.
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"
Dalam kode, dapatkan token akses menggunakan azidentity, lalu gunakan sebagai kata sandi untuk menyambungkan ke Azure PostgreSQL bersama dengan informasi koneksi yang disediakan oleh Koneksi or Layanan. Saat menggunakan kode di bawah ini, batalkan komentar bagian cuplikan kode untuk jenis autentikasi yang ingin Anda gunakan.
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 according to the authentication type.
// 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()
Dalam kode, dapatkan token akses menggunakan @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, batalkan komentar bagian cuplikan kode untuk 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
// });
// 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();
})();
Untuk PHP, tidak ada plugin atau pustaka untuk koneksi tanpa kata sandi. Anda bisa mendapatkan token akses untuk identitas terkelola atau perwakilan layanan dan menggunakannya sebagai kata sandi untuk menyambungkan ke database. Token akses dapat diperoleh menggunakan Azure REST API.
Dalam kode, dapatkan token akses menggunakan REST API dengan pustaka favorit Anda.
Untuk identitas yang ditetapkan pengguna dan identitas yang ditetapkan sistem, App Service dan Container Apps menyediakan titik akhir REST yang dapat diakses secara internal untuk mengambil token untuk identitas terkelola dengan menentukan dua variabel lingkungan: IDENTITY_ENDPOINT dan IDENTITY_HEADER. Untuk informasi selengkapnya, lihat Referensi titik akhir REST.
Dapatkan token akses dengan membuat permintaan HTTP GET ke titik akhir identitas, dan gunakan https://ossrdbms-aad.database.windows.net seperti resource dalam kueri. Untuk identitas yang ditetapkan pengguna, sertakan ID klien dari variabel lingkungan yang ditambahkan oleh Service Koneksi or dalam kueri juga.
Untuk perwakilan layanan, lihat permintaan token akses layanan-ke-layanan Azure AD untuk melihat detail cara memperoleh token akses. Buat permintaan POST cakupan https://ossrdbms-aad.database.windows.net/.default dan dengan ID penyewa, ID klien, dan rahasia klien perwakilan layanan dari variabel lingkungan yang ditambahkan oleh Koneksi or Layanan.
Gabungkan token akses dan sengatan koneksi PostgreSQL dari variabel lingkungan yang ditambahkan oleh layanan service Koneksi or untuk membuat koneksi.
Untuk Ruby, tidak ada plugin atau pustaka untuk koneksi tanpa kata sandi. Anda bisa mendapatkan token akses untuk identitas terkelola atau perwakilan layanan dan menggunakannya sebagai kata sandi untuk menyambungkan ke database. Token akses dapat diperoleh menggunakan Azure REST API.
Instal dependensi.
gem install pg
Dalam kode, dapatkan token akses menggunakan REST API dan informasi koneksi PostgreSQL dari variabel lingkungan yang ditambahkan oleh layanan service Koneksi or. Gabungkan untuk membuat koneksi. Saat menggunakan kode di bawah ini, batalkan komentar bagian cuplikan kode untuk jenis autentikasi yang ingin Anda gunakan.
App service dan container Apps menyediakan titik akhir REST yang dapat diakses secara internal untuk mengambil token untuk identitas terkelola. Untuk informasi selengkapnya, lihat Referensi titik akhir REST.
require 'pg'
require 'dotenv/load'
require 'net/http'
require 'json'
# Uncomment the following lines according to the authentication type.
# 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,
)
Lihat permintaan token akses layanan-ke-layanan Azure ACTIVE Directory untuk melihat detail selengkapnya tentang cara memperoleh token akses untuk perwakilan layanan.
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
Tambahkan dependensi berikut dalam file pom.xml Anda:
Untuk aplikasi Spring, jika Anda membuat koneksi dengan opsi --client-type springboot, Service Koneksi or mengatur properti spring.datasource.azure.passwordless-enabled, spring.datasource.url, dan spring.datasource.username ke Azure Spring Apps.
Autentikasi dengan token akses dapatkan melalui azure-identity pustaka dan dapatkan informasi koneksi 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.
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)
# 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()
Instal dependensi.
pip install azure-identity
Dapatkan token akses melalui azure-identity pustaka dengan 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.
from azure.identity import ManagedIdentityCredential, ClientSecretCredential
import os
# Uncomment the following lines according to the authentication type.
# 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')
Dalam mengatur file, dapatkan informasi database Azure MySQL dari variabel lingkungan yang ditambahkan oleh layanan layanan Koneksi or. Gunakan accessToken yang diperoleh pada langkah sebelumnya untuk mengakses database.
# 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
}
}
Instal dependensi.
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"
Dalam kode, dapatkan token akses melalui azidentity, lalu sambungkan ke Azure MySQL dengan token. Saat menggunakan kode di bawah ini, batalkan komentar bagian cuplikan kode untuk jenis autentikasi yang ingin Anda gunakan.
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 according to the authentication type.
// 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)
}
Dapatkan token akses menggunakan @azure/identity dan informasi database Azure MySQL dari variabel lingkungan yang ditambahkan oleh layanan service Koneksi or. Saat menggunakan kode di bawah ini, batalkan komentar bagian cuplikan kode untuk 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
// });
// 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');
});
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 string koneksi Azure SQL Database dari variabel lingkungan yang ditambahkan oleh Koneksi or Layanan.
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();
}
}
}
Untuk aplikasi Spring, jika Anda membuat koneksi dengan opsi --client-type springboot, Service Koneksi or mengatur properti spring.datasource.url dengan format jdbc:sqlserver://<sql-server>.database.windows.net:1433;databaseName=<sql-db>;authentication=ActiveDirectoryMSI; nilai ke Azure Spring Apps.
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. Jika Anda menggunakan Azure Container Apps sebagai layanan komputasi atau string koneksi dalam cuplikan kode tidak berfungsi, lihat Memigrasikan aplikasi Python untuk menggunakan koneksi tanpa kata sandi dengan Azure SQL Database untuk menyambungkan ke Azure SQL Database menggunakan token akses.
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 according to the authentication type.
# 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)
Instal dependensi.
npm install mssql
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.
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.
Untuk Azure Container Apps, Anda dapat menyebarkan kode aplikasi melalui az containerapp create perintah . Untuk informasi selengkapnya, lihat Mulai Cepat: Menyebarkan aplikasi kontainer pertama Anda.
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
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: