Zelfstudie: Verbinding maken naar Azure-databases vanuit App Service zonder geheimen met behulp van een beheerde identiteit
Artikel
App Servicex biedt een uiterst schaalbare webhostingservice met self-patchfunctie in Azure. Het biedt ook een beheerde identiteit voor uw app, een kant-en-klare oplossing voor het beveiligen van toegang tot Azure-databases, waaronder:
Beheerde identiteiten in App Service maken uw app veiliger doordat geheimen in uw app, zoals referenties in de verbindingsreeksen, worden verwijderd. In deze zelfstudie leert u hoe u verbinding maakt met de hierboven genoemde databases vanuit App Service met behulp van beheerde identiteiten.
U leert het volgende:
Configureer een Microsoft Entra-gebruiker als beheerder voor uw Azure-database.
Verbinding maken als Microsoft Entra-gebruiker naar uw database.
Configureer een door het systeem toegewezen of door de gebruiker toegewezen beheerde identiteit voor een App Service-app.
Ververleent databasetoegang tot de beheerde identiteit.
Verbinding maken vanuit uw code (.NET Framework 4.8, .NET 6, Node.js, Python, Java) naar de Azure-database met behulp van een beheerde identiteit.
Verbinding maken vanuit uw ontwikkelomgeving naar de Azure-database met behulp van de Microsoft Entra-gebruiker.
Maak een app in App Service op basis van .NET, Node.js, Python of Java.
Maak een databaseserver met Azure SQL Database, Azure Database for MySQL of Azure Database for PostgreSQL.
U moet bekend zijn met het standaardverbindingspatroon (met gebruikersnaam en wachtwoord) en verbinding kunnen maken vanuit uw App Service-app naar uw gewenste database.
Installeer de Azure CLI, indien gewenst, om CLI-referentieopdrachten uit te voeren. Als u in Windows of macOS werkt, kunt u Azure CLI uitvoeren in een Docker-container. Zie De Azure CLI uitvoeren in een Docker-container voor meer informatie.
Als u een lokale installatie gebruikt, meldt u zich aan bij Azure CLI met behulp van de opdracht az login. Volg de stappen die worden weergegeven in de terminal, om het verificatieproces te voltooien. Raadpleeg Aanmelden bij Azure CLI voor aanvullende aanmeldingsopties.
Installeer de Azure CLI-extensie bij het eerste gebruik, wanneer u hierom wordt gevraagd. Raadpleeg Extensies gebruiken met Azure CLI voor meer informatie over extensies.
Voer az version uit om de geïnstalleerde versie en afhankelijke bibliotheken te vinden. Voer az upgrade uit om te upgraden naar de nieuwste versie.
1. Installeer de service-Verbinding maken of extensie zonder wachtwoord
Installeer de service-Verbinding maken of extensie zonder wachtwoord voor de Azure CLI:
az extension add --name serviceconnector-passwordless --upgrade
2. Een verbinding zonder wachtwoord maken
Maak vervolgens een verbinding zonder wachtwoord met Service Verbinding maken or.
Tip
De Azure-portal kan u helpen de onderstaande opdrachten op te stellen. Ga in Azure Portal naar uw Azure-app Service-resource, selecteer Service Verbinding maken or in het linkermenu en selecteer Maken. Vul het formulier in met alle vereiste parameters. Azure genereert automatisch de opdracht voor het maken van verbindingen, die u kunt kopiëren om in de CLI te gebruiken of uit te voeren in Azure Cloud Shell.
Voor Azure Database for MySQL - Flexible Server moet u eerst handmatig Microsoft Entra-verificatie instellen. Hiervoor is een afzonderlijke door de gebruiker toegewezen beheerde identiteit en specifieke Microsoft Graph-machtigingen vereist. Deze stap kan niet worden geautomatiseerd.
Machtigingen verlenen aan vooraf gemaakte tabellen
Als u vervolgens tabellen en reeksen hebt gemaakt in de flexibele PostgreSQL-server voordat u Service Verbinding maken or gebruikt, moet u verbinding maken als eigenaar en toestemming verlenen voor <aad-username> het maken van service Verbinding maken or. De gebruikersnaam van de verbindingsreeks of configuratie die is ingesteld door Service Verbinding maken or moet er als aad_<connection name>volgt uitzien. Als u Azure Portal gebruikt, selecteert u de uitvouwknop naast de Service Type kolom en haalt u de waarde op. Als u Azure CLI gebruikt, controleert configurations u de uitvoer van de CLI-opdracht.
Voer vervolgens de query uit om toestemming te verlenen
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>\";"
De <owner-username> en <owner-password> is de eigenaar van de bestaande tabel die machtigingen kan verlenen aan anderen. <aad-username>is de gebruiker die is gemaakt door Service Verbinding maken or. Vervang ze door de werkelijke waarde.
Valideer het resultaat met de opdracht:
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
Met deze service Verbinding maken oropdracht worden de volgende taken op de achtergrond uitgevoerd:
Schakel door het systeem toegewezen beheerde identiteit in of wijs een gebruikersidentiteit toe voor de app <server-name> die wordt gehost door Azure-app Service.
Stel de Microsoft Entra-beheerder in op de huidige aangemelde gebruiker.
Voeg een databasegebruiker toe voor de door het systeem toegewezen beheerde identiteit of door de gebruiker toegewezen beheerde identiteit. Verdeel alle bevoegdheden van de database <database-name> aan deze gebruiker. De gebruikersnaam vindt u in de verbindingsreeks in de voorgaande opdrachtuitvoer.
Stel configuraties met de naam AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRINGof AZURE_SQL_CONNECTIONSTRING op de Azure-resource in op basis van het databasetype.
Voor App Service worden de configuraties ingesteld op de blade App Instellingen.
Als u een probleem ondervindt bij het maken van een verbinding, raadpleegt u Probleemoplossing voor hulp.
Haal de Azure SQL Database-verbindingsreeks op uit de omgevingsvariabele die is toegevoegd door Service Verbinding maken or.
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();
Haal de Azure SQL Database-verbindingsconfiguraties op uit de omgevingsvariabele die is toegevoegd door Service Verbinding maken or. Verwijder opmerkingen bij het deel van het codefragment voor het verificatietype dat u wilt gebruiken.
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)
Haal de Azure SQL Database-verbindingsconfiguraties op uit de omgevingsvariabelen die zijn toegevoegd door Service Verbinding maken or. Verwijder opmerkingen bij het deel van het codefragment voor het verificatietype dat u wilt gebruiken.
Verbinding maken iviteit van Azure Database for MySQL in uw code volgt het DefaultAzureCredential patroon voor alle taalstacks. DefaultAzureCredential is flexibel genoeg om zich aan te passen aan zowel de ontwikkelomgeving als de Azure-omgeving. Wanneer deze lokaal wordt uitgevoerd, kan deze de aangemelde Azure-gebruiker ophalen uit de omgeving van uw keuze (Visual Studio, Visual Studio Code, Azure CLI of Azure PowerShell). Wanneer deze wordt uitgevoerd in Azure, wordt de beheerde identiteit opgehaald. Het is dus mogelijk om zowel tijdens de ontwikkeling als in productie verbinding te maken met de database. Het patroon is als volgt:
Instantieer een DefaultAzureCredential exemplaar van de Azure Identity-clientbibliotheek. Als u een door de gebruiker toegewezen identiteit gebruikt, geeft u de client-id van de identiteit op.
Een toegangstoken ophalen voor Azure Database for MySQL: https://ossrdbms-aad.database.windows.net/.default.
Voor .NET haalt u een toegangstoken op voor de beheerde identiteit met behulp van een clientbibliotheek zoals Azure.Identity. Gebruik vervolgens het toegangstoken als wachtwoord om verbinding te maken met de database. Wanneer u de onderstaande code gebruikt, moet u ervoor zorgen dat u commentaar op het deel van het codefragment opgeeft dat overeenkomt met het verificatietype dat u wilt gebruiken.
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
Voeg de volgende afhankelijkheden toe aan uw pom.xml-bestand :
Verifiëren met een toegangstoken uit de azure-identity bibliotheek. Haal de verbindingsgegevens op uit de omgevingsvariabele die is toegevoegd door Service Verbinding maken or. Wanneer u de onderstaande code gebruikt, moet u ervoor zorgen dat u commentaar op het deel van het codefragment opgeeft dat overeenkomt met het verificatietype dat u wilt gebruiken.
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()
Haal een toegangstoken op met behulp van @azure/identity de Azure MySQL-databasegegevens uit de omgevingsvariabelen die zijn toegevoegd door Service Verbinding maken or. Wanneer u de onderstaande code gebruikt, moet u ervoor zorgen dat u commentaar op het deel van het codefragment opgeeft dat overeenkomt met het verificatietype dat u wilt gebruiken.
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');
});
Verbinding maken iviteit van Azure Database for PostgreSQL in uw code volgt het DefaultAzureCredential patroon voor alle taalstacks. DefaultAzureCredential is flexibel genoeg om zich aan te passen aan zowel de ontwikkelomgeving als de Azure-omgeving. Wanneer deze lokaal wordt uitgevoerd, kan deze de aangemelde Azure-gebruiker ophalen uit de omgeving van uw keuze (Visual Studio, Visual Studio Code, Azure CLI of Azure PowerShell). Wanneer deze wordt uitgevoerd in Azure, wordt de beheerde identiteit opgehaald. Het is dus mogelijk om zowel tijdens de ontwikkeling als in productie verbinding te maken met de database. Het patroon is als volgt:
Instantieer een DefaultAzureCredential exemplaar van de Azure Identity-clientbibliotheek. Als u een door de gebruiker toegewezen identiteit gebruikt, geeft u de client-id van de identiteit op.
Een toegangstoken ophalen voor Azure Database for PostgreSQL: https://ossrdbms-aad.database.windows.net/.default.
Voor .NET haalt u een toegangstoken op voor de beheerde identiteit met behulp van een clientbibliotheek zoals Azure.Identity. Gebruik vervolgens het toegangstoken als wachtwoord om verbinding te maken met de database. Wanneer u de onderstaande code gebruikt, moet u ervoor zorgen dat u commentaar op het deel van het codefragment opgeeft dat overeenkomt met het verificatietype dat u wilt gebruiken.
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();
}
Voeg de volgende afhankelijkheden toe aan uw pom.xml-bestand :
Verifieer met een toegangstoken uit de azure-identity bibliotheek en gebruik het token als wachtwoord. Haal de verbindingsgegevens op uit de omgevingsvariabelen die zijn toegevoegd door Service Verbinding maken or. Wanneer u de onderstaande code gebruikt, moet u ervoor zorgen dat u commentaar op het deel van het codefragment opgeeft dat overeenkomt met het verificatietype dat u wilt gebruiken.
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)
Haal in code het toegangstoken op via @azure/identity en PostgreSQL-verbindingsgegevens uit omgevingsvariabelen die zijn toegevoegd door service Verbinding maken orservice. Combineer ze om de verbinding tot stand te brengen. Wanneer u de onderstaande code gebruikt, moet u ervoor zorgen dat u commentaar op het deel van het codefragment opgeeft dat overeenkomt met het verificatietype dat u wilt gebruiken.
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();
})();
Deze voorbeeldcode maakt gebruik DefaultAzureCredential van een bruikbaar token voor uw Azure-database van Microsoft Entra ID en voegt deze vervolgens toe aan de databaseverbinding. Hoewel u kunt aanpassen DefaultAzureCredential, is deze standaard al veelzijdig. Er wordt een token opgehaald van de aangemelde Microsoft Entra-gebruiker of van een beheerde identiteit, afhankelijk van of u het lokaal uitvoert in uw ontwikkelomgeving of in App Service.
Zonder verdere wijzigingen kunt u uw code uitvoeren in Azure. Om lokaal fouten in uw code op te sporen, heeft uw ontwikkelomgeving echter een aangemelde Microsoft Entra-gebruiker nodig. In deze stap configureert u uw gewenste omgeving door u aan te melden met uw Microsoft Entra-gebruiker.
Visual Studio voor Windows is geïntegreerd met Microsoft Entra-verificatie. Als u ontwikkeling en foutopsporing in Visual Studio wilt inschakelen, voegt u uw Microsoft Entra-gebruiker toe in Visual Studio door bestandsaccount Instellingen te selecteren in het menu en aanmelden of toevoegen te selecteren.>
Als u de Microsoft Entra-gebruiker voor Azure-serviceverificatie wilt instellen, selecteert u Extra>opties in het menu en selecteert u vervolgens Azure Service Authentication>Account Selection. Selecteer de Microsoft Entra-gebruiker die u hebt toegevoegd en selecteer OK.
Visual Studio voor Mac is niet geïntegreerd met Microsoft Entra-verificatie. De Azure Identity-clientbibliotheek die u later gaat gebruiken, kan echter ook tokens ophalen uit Azure CLI. Als u ontwikkeling en foutopsporing in Visual Studio wilt inschakelen, installeert u Azure CLI op uw lokale computer.
Meld u aan bij Azure CLI met de volgende opdracht met behulp van uw Microsoft Entra-gebruiker:
az login --allow-no-subscriptions
Visual Studio Code is geïntegreerd met Microsoft Entra-verificatie via de Azure-extensie. Installeer de Azure Tools-extensie in Visual Studio Code.
Selecteer in Visual Studio Code in de activiteitenbalk het Azure-logo .
Selecteer In App Service Explorer aanmelden bij Azure... en volg de instructies.
De Azure Identity-clientbibliotheek die u later gaat gebruiken, kan tokens van Azure CLI gebruiken. Als u ontwikkeling op basis van opdrachtregels wilt inschakelen, installeert u Azure CLI op uw lokale computer.
Meld u aan bij Azure met de volgende opdracht met behulp van uw Microsoft Entra-gebruiker:
az login --allow-no-subscriptions
De Azure Identity-clientbibliotheek die u later gaat gebruiken, kan tokens uit Azure PowerShell gebruiken. Als u op opdrachtregels gebaseerde ontwikkeling wilt inschakelen, installeert u Azure PowerShell op uw lokale computer.
Meld u aan bij Azure CLI met de volgende cmdlet met behulp van uw Microsoft Entra-gebruiker:
U bent nu klaar om uw app te ontwikkelen en fouten op te sporen met de SQL Database als back-end, met behulp van Microsoft Entra-verificatie.
5. Testen en publiceren
Voer uw code uit in uw ontwikkelomgeving. Uw code maakt gebruik van de aangemelde Microsoft Entra-gebruiker in uw omgeving om verbinding te maken met de back-enddatabase. De gebruiker heeft toegang tot de database omdat deze is geconfigureerd als Microsoft Entra-beheerder voor de database.
Publiceer uw code naar Azure met behulp van de voorkeurspublicatiemethode. In App Service gebruikt uw code de beheerde identiteit van de app om verbinding te maken met de back-enddatabase.
Biedt beheerde identiteit ondersteuning voor SQL Server?
Microsoft Entra ID en beheerde identiteiten worden niet ondersteund voor on-premises SQL Server.
Ik krijg de foutmelding Login failed for user '<token-identified principal>'.
De beheerde identiteit waarvoor u een token wilt aanvragen, is niet gemachtigd voor toegang tot de Azure-database.
Ik heb wijzigingen aangebracht in App Service-verificatie of de bijbehorende app-registratie. Waarom krijg ik nog steeds het oude token?
De back-endservices van beheerde identiteiten onderhouden ook een tokencache waarmee het token voor een doelresource alleen wordt bijgewerkt wanneer het verloopt. Als u de configuratie wijzigt nadat u een token met uw app probeert op te halen, krijgt u pas daadwerkelijk een nieuw token met de bijgewerkte machtigingen als het token in de cache verloopt. De beste manier om dit te omzeilen is door uw wijzigingen te testen met een nieuw InPrivate-venster (Edge)/privévenster (Safari)/Incognito (Chrome). Op die manier begint u zeker vanaf een nieuwe geverifieerde sessie.
Hoe kan ik de beheerde identiteit toevoegen aan een Microsoft Entra-groep?
Als u wilt, kunt u de identiteit toevoegen aan een Microsoft Entra-groep en vervolgens toegang verlenen tot de Microsoft Entra-groep in plaats van de identiteit. Bijvoorbeeld, met de volgende opdrachten wordt de beheerde identiteit uit de vorige stap toegevoegd aan een nieuwe groep met de naam 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
Als u databasemachtigingen wilt verlenen voor een Microsoft Entra-groep, raadpleegt u de documentatie voor het respectieve databasetype.
Ik krijg de foutmelding SSL connection is required. Please specify SSL options and retry.
Verbinding maken voor de Azure-database zijn aanvullende instellingen vereist en valt buiten het bereik van deze zelfstudie. Zie een van de volgende koppelingen voor meer informatie: