Usługa App Service oferuje wysoce skalowalną i samonaprawialną usługę hostingu w Internecie na platformie Azure. Zapewnia również tożsamość zarządzaną dla aplikacji, która jest rozwiązaniem kluczowym dla zabezpieczania dostępu do baz danych platformy Azure, w tym:
Tożsamości zarządzane w usłudze App Service zwiększają bezpieczeństwo aplikacji przez wyeliminowanie tajnych danych z aplikacji, takich jak poświadczenia w ciągach połączenia. W tym samouczku pokazano, jak nawiązać połączenie z wyżej wymienionymi bazami danych z usługi App Service przy użyciu tożsamości zarządzanych.
Czego nauczysz się:
- Skonfiguruj użytkownika firmy Microsoft Entra jako administratora dla bazy danych platformy Azure.
- Połącz się z bazą danych jako użytkownik microsoft Entra.
- Skonfiguruj tożsamość zarządzaną przypisaną przez system lub przypisaną przez użytkownika dla aplikacji usługi App Service.
- Udziel dostępu do bazy danych tożsamości zarządzanej.
- Połącz się z bazą danych platformy Azure z poziomu kodu (.NET Framework 4.8, .NET 6, Node.js, Python, Java) przy użyciu tożsamości zarządzanej.
- Połącz się z bazą danych platformy Azure ze środowiska deweloperskiego przy użyciu użytkownika Firmy Microsoft Entra.
Jeśli nie masz jeszcze konta platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.
Wymagania wstępne
- Utwórz aplikację w usłudze App Service na podstawie platformy .NET, Node.js, Python lub Java.
- Utwórz serwer bazy danych za pomocą usługi Azure SQL Database, usługi Azure Database for MySQL lub usługi Azure Database for PostgreSQL.
- Należy zapoznać się ze standardowym wzorcem łączności (z nazwą użytkownika i hasłem) i mieć możliwość pomyślnego nawiązania połączenia z poziomu wybranej bazy danych z poziomu aplikacji usługi App Service.
Przygotuj swoje środowisko dla Azure CLI.
1. Zainstaluj rozszerzenie bez hasła Service Connector
Zainstaluj najnowsze rozszerzenie bez hasła łącznika usługi dla interfejsu wiersza polecenia platformy Azure:
az extension add --name serviceconnector-passwordless --upgrade
Uwaga / Notatka
Sprawdź rozszerzenie "serviceconnector-passwordless" w wersji "2.0.2" lub nowszej, uruchamiając polecenie az version. Aby uaktualnić wersję rozszerzenia, może być konieczne uaktualnienie interfejsu wiersza polecenia platformy Azure.
2. Tworzenie połączenia bez hasła
Następnie utwórz połączenie bez hasła z łącznikiem usługi.
Wskazówka
Portal Azure może pomóc w redagowaniu poniższych poleceń. W witrynie Azure Portal przejdź do zasobu usługi Azure App Service , wybierz pozycję Łącznik usługi w menu po lewej stronie i wybierz pozycję Utwórz. Wypełnij formularz wszystkimi wymaganymi parametrami. Platforma Azure automatycznie generuje polecenie tworzenia połączenia, które można skopiować do użycia w interfejsie wiersza polecenia lub wykonać w usłudze Azure Cloud Shell.
Następujące polecenie interfejsu wiersza polecenia platformy Azure używa parametru --client-type .
Opcjonalnie uruchom az webapp connection create sql -h, aby uzyskać obsługiwane typy klientów.
Wybierz typ klienta i uruchom odpowiednie polecenie. Zastąp symbole zastępcze poniżej własnymi informacjami.
az webapp connection create sql \
--resource-group <group-name> \
--name <server-name> \
--target-resource-group <sql-group-name> \
--server <sql-name> \
--database <database-name> \
--user-identity client-id=<client-id> subs-id=<subscription-id> \
--client-type <client-type>
az webapp connection create sql \
--resource-group <group-name> \
--name <server-name> \
--target-resource-group <group-name> \
--server <sql-name> \
--database <database-name> \
--system-identity \
--client-type <client-type>
Uwaga / Notatka
W przypadku usługi Azure Database for MySQL — serwer elastyczny należy najpierw ręcznie skonfigurować uwierzytelnianie firmy Microsoft Entra, które wymaga oddzielnej tożsamości zarządzanej przypisanej przez użytkownika i określonych uprawnień programu Microsoft Graph. Nie można zautomatyzować tego kroku.
Ręcznie skonfiguruj uwierzytelnianie usługi Microsoft Entra dla usługi Azure Database for MySQL — serwer elastyczny.
Opcjonalnie uruchom polecenie az webapp connection create mysql-flexible -h , aby uzyskać obsługiwane typy klientów.
Wybierz typ klienta i uruchom odpowiednie polecenie. Następujące polecenie interfejsu wiersza polecenia platformy Azure używa parametru --client-type .
az webapp connection create mysql-flexible \
--resource-group <group-name> \
--name <server-name> \
--target-resource-group <group-name> \
--server <mysql-name> \
--database <database-name> \
--user-identity client-id=XX subs-id=XX mysql-identity-id=$IDENTITY_RESOURCE_ID \
--client-type <client-type>
az webapp connection create mysql-flexible \
--resource-group <group-name> \
--name <server-name> \
--target-resource-group <group-name> \
--server <mysql-name> \
--database <database-name> \
--system-identity mysql-identity-id=$IDENTITY_RESOURCE_ID \
--client-type <client-type>
Następujące polecenie interfejsu wiersza polecenia platformy Azure używa parametru --client-type .
Opcjonalnie uruchom polecenie az webapp connection create postgres-flexible -h , aby uzyskać listę wszystkich obsługiwanych typów klientów.
Wybierz typ klienta i uruchom odpowiednie polecenie.
az webapp connection create postgres-flexible \
--resource-group <group-name> \
--name <server-name> \
--target-resource-group <group-name> \
--server <postgresql-name> \
--database <database-name> \
--user-identity client-id=XX subs-id=XX \
--client-type java
az webapp connection create postgres-flexible \
--resource-group <group-name> \
--name <server-name> \
--target-resource-group <group-name> \
--server <postgresql-name> \
--database <database-name> \
--system-identity \
--client-type <client-type>
Udzielanie uprawnień do wstępnie utworzonych tabel
Następnie, jeśli utworzono tabele i sekwencje na serwerze elastycznym PostgreSQL przed użyciem łącznika usługi, musisz nawiązać połączenie jako właściciel i udzielić uprawnień do <aad-username> utworzenia przez łącznik usługi. Nazwa użytkownika z parametry połączenia lub konfiguracji ustawionej przez łącznik usługi powinna wyglądać następująco: aad_<connection name>. Jeśli używasz witryny Azure Portal, wybierz przycisk rozwijania obok Service Type kolumny i pobierz wartość. Jeśli używasz interfejsu wiersza polecenia platformy Azure, sprawdź configurations dane wyjściowe polecenia interfejsu wiersza polecenia.
Następnie wykonaj zapytanie, aby udzielić uprawnienia
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>\";"
Element <owner-username> i <owner-password> jest właścicielem istniejącej tabeli, która może udzielić uprawnień innym osobom.
<aad-username> to użytkownik utworzony przez łącznik usługi. Zastąp je rzeczywistą wartością.
Zweryfikuj wynik za pomocą polecenia :
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
To polecenie łącznika usługi wykonuje następujące zadania w tle:
- Włącz tożsamość zarządzaną przypisaną przez system lub przypisz tożsamość użytkownika dla aplikacji
<server-name> hostowanej przez usługę Azure App Service.
- Ustaw bieżącego zalogowanego użytkownika jako administratora Microsoft Entra.
- Dodaj użytkownika bazy danych dla przypisanej przez system tożsamości zarządzanej lub tożsamości zarządzanej przypisanej przez użytkownika. Przyznaj temu użytkownikowi wszystkie uprawnienia bazy danych
<database-name> . Nazwę użytkownika można znaleźć w parametry połączenia w poprzednich danych wyjściowych polecenia.
- Ustaw konfiguracje o nazwie
AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRINGlub AZURE_SQL_CONNECTIONSTRING na zasób platformy Azure na podstawie typu bazy danych.
- W przypadku usługi App Service konfiguracje są ustawiane w bloku Ustawienia aplikacji .
Jeśli wystąpi jakikolwiek problem podczas tworzenia połączenia, zapoznaj się z tematem Rozwiązywanie problemów , aby uzyskać pomoc.
3. Modyfikowanie kodu
Instalowanie zależności.
dotnet add package Microsoft.Data.SqlClient
Pobierz parametry połączenia usługi Azure SQL Database ze zmiennej środowiskowej dodanej przez łącznik usługi.
using Microsoft.Data.SqlClient;
// AZURE_SQL_CONNECTIONSTRING should be one of the following:
// For system-assigned managed identity:"Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;TrustServerCertificate=True"
// For user-assigned managed identity: "Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;User Id=<client-id-of-user-assigned-identity>;TrustServerCertificate=True"
string connectionString =
Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
using var connection = new SqlConnection(connectionString);
connection.Open();
Aby uzyskać więcej informacji, zobacz Używanie uwierzytelniania tożsamości zarządzanej w usłudze Active Directory.
Dodaj następujące zależności w pliku pom.xml :
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>1.4.6</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>10.2.0.jre11</version>
</dependency>
Pobierz parametry połączenia usługi Azure SQL Database ze zmiennej środowiskowej dodanej przez łącznik usługi.
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;"
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();
}
}
}
Aby uzyskać więcej informacji, zobacz Connect using Microsoft Entra authentication (Łączenie przy użyciu uwierzytelniania firmy Microsoft Entra).
Instalowanie zależności.
python -m pip install pyodbc
Pobierz konfiguracje połączeń usługi Azure SQL Database ze zmiennej środowiskowej dodanej przez łącznik usługi. Usuń komentarz ze fragmentu kodu dla typu uwierzytelniania, którego chcesz użyć.
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)
Alternatywną metodą można również nawiązać połączenie z usługą Azure SQL Database przy użyciu tokenu dostępu, zobacz Migrowanie aplikacji języka Python w celu używania połączeń bez hasła z usługą Azure SQL Database.
- Instalowanie zależności.
npm install mssql
- Pobierz konfiguracje połączeń usługi Azure SQL Database ze zmiennych środowiskowych dodanych przez łącznik usługi. Usuń komentarz ze fragmentu kodu dla typu uwierzytelniania, którego chcesz użyć.
import sql from 'mssql';
const server = process.env.AZURE_SQL_SERVER;
const database = process.env.AZURE_SQL_DATABASE;
const port = parseInt(process.env.AZURE_SQL_PORT);
const authenticationType = process.env.AZURE_SQL_AUTHENTICATIONTYPE;
// Uncomment the following lines according to the authentication type.
// For system-assigned managed identity.
// const config = {
// server,
// port,
// database,
// authentication: {
// authenticationType
// },
// options: {
// encrypt: true
// }
// };
// For user-assigned managed identity.
// const clientId = process.env.AZURE_SQL_CLIENTID;
// const config = {
// server,
// port,
// database,
// authentication: {
// type: authenticationType
// },
// options: {
// encrypt: true,
// clientId: clientId
// }
// };
this.poolconnection = await sql.connect(config);
Aby uzyskać więcej informacji, zobacz Strona główna programowania klientów w programie Microsoft SQL Server.
Aby uzyskać więcej przykładów kodu, zobacz Create a passwordless connection to a database service via Service Connector (Tworzenie połączenia bez hasła z usługą za pośrednictwem łącznika usługi).
Łączność z usługą Azure Database for MySQL w kodzie jest zgodna ze wzorcem DefaultAzureCredential dla wszystkich stosów języków.
DefaultAzureCredential jest wystarczająco elastyczny, aby dostosować się zarówno do środowiska deweloperskiego, jak i środowiska platformy Azure. Po uruchomieniu lokalnie może pobrać zalogowanego użytkownika platformy Azure ze wybranego środowiska (Visual Studio, Visual Studio Code, interfejs wiersza polecenia platformy Azure lub programu Azure PowerShell). Podczas uruchamiania na platformie Azure pobiera tożsamość zarządzaną. W związku z tym można mieć łączność z bazą danych zarówno w czasie programowania, jak i w środowisku produkcyjnym. Wzorzec jest następujący:
- Utwórz wystąpienie obiektu
DefaultAzureCredential z biblioteki klienta Azure Identity. Jeśli używasz tożsamości przypisanej użytkownikowi, określ identyfikator klienta tej tożsamości.
- Uzyskaj token dostępu dla usługi Azure Database for MySQL:
https://ossrdbms-aad.database.windows.net/.default.
- Dodaj token do parametrów połączenia.
- Otwórz połączenie.
W przypadku platformy .NET uzyskaj token dostępu dla tożsamości zarządzanej przy użyciu biblioteki klienta, takiej jak Azure.Identity. Następnie użyj tokenu dostępu jako hasła, aby nawiązać połączenie z bazą danych. Korzystając z poniższego kodu, upewnij się, że usuniesz komentarz z tej części kodu, która odpowiada typowi uwierzytelniania, którego chcesz użyć.
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
Dodaj następujące zależności w pliku pom.xml :
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity-extensions</artifactId>
<version>1.2.0</version>
</dependency>
Pobierz parametry połączenia ze zmiennej środowiskowej i dodaj nazwę wtyczki, aby nawiązać połączenie z bazą danych:
String url = System.getenv("AZURE_MYSQL_CONNECTIONSTRING");
String pluginName = "com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin";
Connection connection = DriverManager.getConnection(url + "&defaultAuthenticationPlugin=" +
pluginName + "&authenticationPlugins=" + pluginName);
Aby uzyskać więcej informacji, zobacz Używanie języków Java i JDBC z usługą Azure Database for MySQL — serwer elastyczny.
Instalowanie zależności.
pip install azure-identity
# install Connector/Python https://dev.mysql.com/doc/connector-python/en/connector-python-installation.html
pip install mysql-connector-python
Uwierzytelnij się za pomocą tokenu dostępu z biblioteki azure-identity. Pobierz informacje o połączeniu ze zmiennej środowiskowej dodanej przez łącznik usługi. Korzystając z poniższego kodu, upewnij się, że usuniesz komentarz z tej części kodu, która odpowiada typowi uwierzytelniania, którego chcesz użyć.
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()
Instalowanie zależności.
npm install --save @azure/identity
npm install --save mysql2
Uzyskaj token dostępu, korzystając z @azure/identity oraz z informacji o bazie danych Azure MySQL pochodzących ze zmiennych środowiskowych dodanych przez Service Connector. Korzystając z poniższego kodu, upewnij się, że usuniesz komentarz z tej części kodu, która odpowiada typowi uwierzytelniania, którego chcesz użyć.
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');
});
Aby uzyskać więcej przykładów kodu, zobacz Create a passwordless connection to a database service via Service Connector (Tworzenie połączenia bez hasła z usługą za pośrednictwem łącznika usługi).
Łączność z Azure Database for PostgreSQL w kodzie jest zgodna ze wzorcem DefaultAzureCredential w przypadku wszystkich środowisk językowych.
DefaultAzureCredential jest wystarczająco elastyczny, aby dostosować się zarówno do środowiska deweloperskiego, jak i środowiska platformy Azure. Po uruchomieniu lokalnie może pobrać zalogowanego użytkownika platformy Azure ze wybranego środowiska (Visual Studio, Visual Studio Code, interfejs wiersza polecenia platformy Azure lub programu Azure PowerShell). Podczas uruchamiania na platformie Azure pobiera tożsamość zarządzaną. W związku z tym można mieć łączność z bazą danych zarówno w czasie programowania, jak i w środowisku produkcyjnym. Wzorzec jest następujący:
- Utwórz wystąpienie obiektu
DefaultAzureCredential z biblioteki klienta Azure Identity. Jeśli używasz tożsamości przypisanej użytkownikowi, określ identyfikator klienta tej tożsamości.
- Uzyskaj token dostępu dla usługi Azure Database for PostgreSQL:
https://ossrdbms-aad.database.windows.net/.default.
- Dodaj token do parametrów połączenia.
- Otwórz połączenie.
W przypadku platformy .NET uzyskaj token dostępu dla tożsamości zarządzanej przy użyciu biblioteki klienta, takiej jak Azure.Identity. Następnie użyj tokenu dostępu jako hasła, aby nawiązać połączenie z bazą danych. Korzystając z poniższego kodu, upewnij się, że usuniesz komentarz z tej części kodu, która odpowiada typowi uwierzytelniania, którego chcesz użyć.
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();
}
Dodaj następujące zależności w pliku pom.xml :
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.5</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity-extensions</artifactId>
<version>1.2.0</version>
</dependency>
Pobierz parametry połączenia ze zmiennych środowiskowych i dodaj nazwę wtyczki, aby nawiązać połączenie z bazą danych:
import java.sql.*;
String url = System.getenv("AZURE_POSTGRESQL_CONNECTIONSTRING");
String pluginName = "com.Azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin";
Connection connection = DriverManager.getConnection(url + "&authenticationPluginClassName=" + pluginName);
Aby uzyskać więcej informacji, zobacz następujące zasoby:
Instalowanie zależności.
pip install azure-identity
pip install psycopg2-binary
Uwierzytelnij się przy użyciu tokenu dostępu z azure-identity biblioteki i użyj tokenu jako hasła. Pobierz informacje o połączeniu ze zmiennych środowiskowych dodanych przez łącznik usługi. Korzystając z poniższego kodu, upewnij się, że usuniesz komentarz z tej części kodu, która odpowiada typowi uwierzytelniania, którego chcesz użyć.
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)
Aby uzyskać więcej informacji, zobacz następujące zasoby:
Instalowanie zależności.
npm install --save @azure/identity
npm install --save pg
W kodzie uzyskaj token dostępu za pomocą @azure/identity oraz informacje o połączeniu PostgreSQL ze zmiennych środowiskowych dodanych przez usługę Service Connector. Połącz je, aby nawiązać połączenie. Korzystając z poniższego kodu, upewnij się, że usuniesz komentarz z tej części kodu, która odpowiada typowi uwierzytelniania, którego chcesz użyć.
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();
})();
Aby uzyskać więcej przykładów kodu, zobacz Create a passwordless connection to a database service via Service Connector (Tworzenie połączenia bez hasła z usługą za pośrednictwem łącznika usługi).
4. Konfigurowanie środowiska deweloperskiego
Ten przykładowy kod używa DefaultAzureCredential do uzyskania użytecznego tokena dla bazy danych Azure z Microsoft Entra ID, a następnie dodaje go do połączenia z bazą danych. Chociaż można dostosować DefaultAzureCredential, element jest już wszechstronny domyślnie. Pobiera token z zalogowanego użytkownika Microsoft Entra lub tożsamości zarządzanej, w zależności od tego, czy jest uruchamiany lokalnie w środowisku deweloperów, czy w usłudze App Service.
Bez żadnych dalszych zmian kod jest gotowy do uruchomienia na platformie Azure. Aby debugować lokalnie kod, jednakże lokalne środowisko deweloperskie wymaga zalogowanego użytkownika Microsoft Entra. W tym kroku skonfigurujesz wybrane środowisko, logując się przy użyciu użytkownika firmy Microsoft Entra.
Program Visual Studio dla systemu Windows jest zintegrowany z uwierzytelnianiem firmy Microsoft Entra. Aby włączyć programowanie i debugowanie w programie Visual Studio, dodaj użytkownika microsoft Entra w programie Visual Studio, wybierając pozycję Ustawienia konta plików>z menu, a następnie wybierz pozycję Zaloguj się lub Dodaj.
Aby ustawić użytkownika microsoft Entra na potrzeby uwierzytelniania usługi platformy Azure, wybierz pozycję Narzędzia> z menu, a następnie wybierz pozycję Wybór konta uwierzytelniania>usługi platformy Azure. Wybierz dodanego użytkownika Microsoft Entra i wybierz przycisk OK.
Visual Studio dla komputerów Mac nie jest zintegrowana z uwierzytelnianiem firmy Microsoft Entra. Jednak biblioteka klienta tożsamości platformy Azure, której będziesz używać później, może również pobierać tokeny z interfejsu wiersza polecenia platformy Azure. Aby włączyć programowanie i debugowanie w programie Visual Studio, zainstaluj interfejs wiersza polecenia platformy Azure na komputerze lokalnym.
Zaloguj się do interfejsu wiersza polecenia platformy Azure przy użyciu następującego polecenia przy użyciu użytkownika firmy Microsoft Entra:
az login --allow-no-subscriptions
Program Visual Studio Code jest zintegrowany z uwierzytelnianiem firmy Microsoft entra za pośrednictwem rozszerzenia platformy Azure.
Zainstaluj rozszerzenie Azure Tools w programie Visual Studio Code.
W programie Visual Studio Code na pasku działań wybierz logo platformy Azure .
W Eksploratorze usługi App Service wybierz pozycję Zaloguj się do platformy Azure... i postępuj zgodnie z instrukcjami.
Biblioteka klienta tożsamości platformy Azure, której będziesz używać później, może używać tokenów z poziomu interfejsu wiersza polecenia platformy Azure. Aby włączyć programowanie oparte na wierszu polecenia, zainstaluj interfejs wiersza polecenia platformy Azure na komputerze lokalnym.
Zaloguj się do platformy Azure przy użyciu następującego polecenia przy użyciu użytkownika microsoft Entra:
az login --allow-no-subscriptions
Biblioteka klienta tożsamości platformy Azure, której będziesz używać później, może używać tokenów z poziomu programu Azure PowerShell. Aby włączyć programowanie oparte na wierszu polecenia, zainstaluj program Azure PowerShell na komputerze lokalnym.
Zaloguj się do interfejsu wiersza polecenia platformy Azure przy użyciu następującego polecenia cmdlet przy użyciu użytkownika firmy Microsoft Entra:
Connect-AzAccount
Aby uzyskać więcej informacji na temat konfigurowania środowiska deweloperskiego na potrzeby uwierzytelniania firmy Microsoft Entra, zobacz Biblioteka klienta tożsamości platformy Azure dla platformy .NET.
Teraz możesz przystąpić do tworzenia i debugowania aplikacji przy użyciu usługi SQL Database jako zaplecza przy użyciu uwierzytelniania firmy Microsoft Entra.
5. Testowanie i publikowanie
Uruchom kod w środowisku deweloperskim. Kod używa zalogowanego użytkownika Microsoft Entra w Twoim środowisku, aby połączyć się z bazą danych zaplecza. Użytkownik może uzyskać dostęp do bazy danych, ponieważ jest skonfigurowany jako administrator firmy Microsoft Entra dla bazy danych.
Opublikuj kod na platformie Azure przy użyciu preferowanej metody publikowania. W usłudze App Service kod używa tożsamości zarządzanej aplikacji do nawiązywania połączenia z bazą danych zaplecza.
Najczęściej zadawane pytania
Czy tożsamość zarządzana obsługuje SQL Server?
Tak. Aby uzyskać więcej informacji, zobacz:
Otrzymuję błąd Login failed for user '<token-identified principal>'.
Tożsamość zarządzana, dla której próbujesz zażądać tokenu, nie ma autoryzacji dostępu do bazy danych platformy Azure.
Wprowadzono zmiany w uwierzytelnianiu usługi App Service lub skojarzonej rejestracji aplikacji. Dlaczego nadal otrzymuję stary token?
Usługi zaplecza tożsamości zarządzanych również utrzymują pamięć podręczną tokenów , która aktualizuje token dla zasobu docelowego tylko wtedy, gdy wygaśnie. Jeśli po próbie uzyskania tokenu z aplikacją zmodyfikujesz konfigurację, nie otrzymasz nowego tokenu ze zaktualizowanymi uprawnieniami do momentu wygaśnięcia buforowanego tokenu. Najlepszym sposobem obejścia tego jest przetestowanie zmian za pomocą nowego okna InPrivate (Edge)/private (Safari)/Incognito (Chrome). W ten sposób na pewno zaczniesz od nowej sesji uwierzytelnionej.
Jak dodać tożsamość zarządzaną do grupy firmy Microsoft Entra?
Jeśli chcesz, możesz dodać tożsamość do grupy Microsoft Entra, a następnie udzielić dostępu do grupy Microsoft Entra zamiast tożsamości. Na przykład następujące polecenia dodają tożsamość zarządzaną z poprzedniego kroku do nowej grupy o nazwie 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
Aby udzielić uprawnień bazy danych dla grupy entra firmy Microsoft, zobacz dokumentację odpowiedniego typu bazy danych.
Otrzymuję błąd SSL connection is required. Please specify SSL options and retry.
Nawiązywanie połączenia z bazą danych platformy Azure wymaga dodatkowych ustawień i wykracza poza zakres tego samouczka. Aby uzyskać więcej informacji, zobacz jeden z następujących linków:
Konfigurowanie łączności TLS w usłudze Azure Database for PostgreSQL — pojedynczy serwerSkonfiguruj łączność SSL w aplikacji, aby bezpiecznie połączyć się z usługą Azure Database for MySQL
Łącznik usługi wymaga dostępu sieciowego do bazy danych w celu ustalenia tożsamości aplikacji. Podczas tworzenia bezpiecznej domyślnie architektury aplikacji i bazy danych w witrynie Azure Portal przy użyciu szablonu Web App + Database architektura blokuje dostęp sieciowy do bazy danych i zezwala tylko na połączenia z sieci wirtualnej. Dotyczy to również usługi Azure Cloud Shell. Można jednak wdrożyć usługę Cloud Shell w sieci wirtualnej, a następnie uruchomić polecenie Łącznik usługi w tej usłudze Cloud Shell.
Dalsze kroki
Czego się nauczyłeś:
- Skonfiguruj użytkownika firmy Microsoft Entra jako administratora dla bazy danych platformy Azure.
- Połącz się z bazą danych jako użytkownik microsoft Entra.
- Skonfiguruj tożsamość zarządzaną przypisaną przez system lub przypisaną przez użytkownika dla aplikacji usługi App Service.
- Udziel dostępu do bazy danych tożsamości zarządzanej.
- Połącz się z bazą danych platformy Azure z poziomu kodu (.NET Framework 4.8, .NET 6, Node.js, Python, Java) przy użyciu tożsamości zarządzanej.
- Połącz się z bazą danych platformy Azure ze środowiska deweloperskiego przy użyciu użytkownika Firmy Microsoft Entra.