Delen via


Zelfstudie: Een verbinding zonder wachtwoord maken met een databaseservice via serviceconnector

Verbindingen zonder wachtwoord maken gebruik van beheerde identiteiten voor toegang tot Azure-services. Met deze aanpak hoeft u geheimen voor beheerde identiteiten niet handmatig bij te houden en te beheren. Deze taken worden veilig intern verwerkt door Azure.

Service Connector maakt beheerde identiteiten mogelijk in app-hostingservices zoals Azure Spring Apps, Azure-app Service en Azure Container Apps. Service Connector configureert ook databaseservices, zoals Azure Database for PostgreSQL, Azure Database for MySQL en Azure SQL Database, om beheerde identiteiten te accepteren.

In deze zelfstudie gebruikt u de Azure CLI om de volgende taken te voltooien:

  • Controleer uw eerste omgeving met de Azure CLI.
  • Maak een verbinding zonder wachtwoord met serviceconnector.
  • Gebruik de omgevingsvariabelen of configuraties die door Service Connector worden gegenereerd voor toegang tot een databaseservice.

Vereisten

Uw omgeving instellen

Rekening

Meld u aan met de Azure CLI via az login. Als u Azure Cloud Shell gebruikt of al bent aangemeld, bevestigt u uw geverifieerde account met az account show.

De serviceconnector-extensie zonder wachtwoord installeren

Installeer de nieuwste serviceconnector-extensie zonder wachtwoord voor de Azure CLI:

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

Notitie

Controleer of de extensie 'serviceconnector-passwordless' versie '2.0.2' of hoger is door uit te voeren az version. Mogelijk moet u eerst azure CLI upgraden om de extensieversie te upgraden.

Een verbinding zonder wachtwoord maken

Vervolgens gebruiken we Azure-app Service als voorbeeld om een verbinding te maken met behulp van een beheerde identiteit.

Als u het volgende gebruikt:

Notitie

Als u Azure Portal gebruikt, gaat u naar de blade Serviceconnector van Azure-app Service, Azure Spring Apps of Azure Container Apps en selecteert u Maken om een verbinding te maken. De Azure-portal stelt automatisch de opdracht voor u samen en activeert de uitvoering van de opdracht in Cloud Shell.

De volgende Azure CLI-opdracht maakt gebruik van een --client-type parameter, dit kan java, dotnet, python, enzovoort zijn. Voer de az webapp connection create postgres-flexible -h opdracht uit om de ondersteunde clienttypen op te halen en kies de parameter die overeenkomt met uw toepassing.

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type $CLIENT_TYPE

Azure Database for MySQL - Flexible Server vereist een door de gebruiker toegewezen beheerde identiteit om Microsoft Entra-verificatie in te schakelen. Zie Microsoft Entra-verificatie instellen voor Azure Database for MySQL - Flexible Server voor meer informatie. U kunt de volgende opdracht gebruiken om een door de gebruiker toegewezen beheerde identiteit te maken:

USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

Belangrijk

Nadat u de door de gebruiker toegewezen beheerde identiteit hebt gemaakt, vraagt u de globale beheerder of bevoorrechte rolbeheerder om de volgende machtigingen voor deze identiteit te verlenen:

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

Zie de sectie Machtigingen van Active Directory-verificatie voor meer informatie.

Verbind vervolgens uw app met een MySQL-database met een door het systeem toegewezen beheerde identiteit met behulp van Service Connector.

De volgende Azure CLI-opdracht maakt gebruik van een --client-type parameter. Voer de az webapp connection create mysql-flexible -h opdracht uit om de ondersteunde clienttypen op te halen en kies de client die overeenkomt met uw toepassing.

az webapp connection create mysql-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $MYSQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX mysql-identity-id=$IDENTITY_RESOURCE_ID \
    --client-type java

De volgende Azure CLI-opdracht maakt gebruik van een --client-type parameter. Voer de az webapp connection create sql -h opdracht uit om de ondersteunde clienttypen op te halen en kies de client die overeenkomt met uw toepassing.

az webapp connection create sql \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $SQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type dotnet

Met deze serviceconnectoropdracht worden de volgende taken op de achtergrond uitgevoerd:

  • Schakel door het systeem toegewezen beheerde identiteit in of wijs een gebruikersidentiteit toe voor de app $APPSERVICE_NAME die wordt gehost door Azure-app Service/Azure Spring Apps/Azure Container Apps.
  • Schakel Microsoft Entra-verificatie in voor de databaseserver als deze nog niet is ingeschakeld.
  • Stel de Microsoft Entra-beheerder in op de huidige aangemelde gebruiker.
  • Voeg een databasegebruiker toe voor de door het systeem toegewezen beheerde identiteit, door de gebruiker toegewezen beheerde identiteit of service-principal. 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 .
    • Voor Spring Apps worden de configuraties ingesteld wanneer de toepassing wordt gestart.
    • Voor Container Apps worden de configuraties ingesteld op de omgevingsvariabelen. U kunt alle configuraties en de bijbehorende waarden ophalen op de blade Serviceconnector in Azure Portal.

ServiceConnector wijst de volgende bevoegdheden toe aan de gebruiker, u kunt deze intrekken en de bevoegdheden aanpassen op basis van uw vereisten.

GRANT ALL PRIVILEGES ON DATABASE "$DATABASE_NAME" TO "username"; 

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "username"; 

GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO 'username'@'%'; 
GRANT CONTROL ON DATABASE::"$DATABASE_NAME" TO "username";

Verbinding maken met een database met Microsoft Entra-verificatie

Nadat u de verbinding hebt gemaakt, kunt u de verbindingsreeks in uw toepassing gebruiken om verbinding te maken met de database met Microsoft Entra-verificatie. U kunt bijvoorbeeld de volgende oplossingen gebruiken om verbinding te maken met de database met Microsoft Entra-verificatie.

Voor .NET is er geen invoegtoepassing of bibliotheek om wachtwoordloze verbindingen te ondersteunen. U kunt een toegangstoken ophalen voor de beheerde identiteit of service-principal met behulp van de clientbibliotheek, zoals Azure.Identity. Vervolgens kunt u het toegangstoken als wachtwoord gebruiken om verbinding te maken met de database. Als u de onderstaande code gebruikt, moet u het gedeelte van het codefragment verwijderen voor het verificatietype dat u wilt gebruiken.

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

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

Als u vervolgens tabellen en reeksen hebt gemaakt in postgreSQL flexibele server voordat u Service Connector gebruikt, moet u verbinding maken als eigenaar en toestemming verlenen voor <aad-username> het maken van serviceconnector. De gebruikersnaam van de verbindingsreeks of configuratie die is ingesteld door serviceconnector, 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 Connector. 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

Voor .NET is er geen invoegtoepassing of bibliotheek om wachtwoordloze verbindingen te ondersteunen. U kunt een toegangstoken ophalen voor de beheerde identiteit of service-principal met behulp van de clientbibliotheek, zoals Azure.Identity. Vervolgens kunt u het toegangstoken als wachtwoord gebruiken om verbinding te maken met de database. Als u de onderstaande code gebruikt, moet u het gedeelte van het codefragment verwijderen voor het verificatietype dat u wilt gebruiken.

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

// Uncomment the following lines corresponding to the authentication type you want to use.
// 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

Zie Verbinding maken met Azure-databases vanuit App Service zonder geheimen met behulp van een beheerde identiteit voor meer codevoorbeelden.

  1. Installeer afhankelijkheden.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Haal de Azure SQL Database-verbindingsreeks op uit de omgevingsvariabele die is toegevoegd door Service Connector.

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

    Zie Active Directory Managed Identity-verificatie gebruiken voor meer informatie.

Zie Startpagina voor clientprogrammering naar Microsoft SQL Server voor meer informatie.

De toepassing implementeren in een Azure-hostingservice

Implementeer ten slotte uw toepassing in een Azure-hostingservice. Deze bronservice kan een beheerde identiteit gebruiken om verbinding te maken met de doeldatabase in Azure.

Voor Azure-app Service kunt u het document controleren om een manier te kiezen om te implementeren. Zie Quickstart: Een ASP.NET-web-app implementeren.

Vervolgens kunt u het logboek controleren of de toepassing aanroepen om te zien of deze verbinding kan maken met de Azure-database.

Probleemoplossing

Machtiging

Als er machtigingsfouten optreden, bevestigt u de aangemelde Gebruiker van Azure CLI met de opdracht az account show. Zorg ervoor dat u zich aanmeldt met het juiste account. Controleer vervolgens of u de volgende machtigingen hebt die mogelijk vereist zijn om een verbinding zonder wachtwoord te maken met serviceconnector.

Machtiging Operation
Microsoft.DBforPostgreSQL/flexibleServers/read Vereist voor het ophalen van gegevens van de databaseserver
Microsoft.DBforPostgreSQL/flexibleServers/write Vereist voor het inschakelen van Microsoft Entra-verificatie voor databaseserver
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write Vereist voor het maken van een firewallregel voor het geval het lokale IP-adres wordt geblokkeerd
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete Vereist om de firewallregel die door Service Connector is gemaakt, te herstellen om beveiligingsproblemen te voorkomen
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read Vereist om te controleren of de azure CLI-aanmeldingsgebruiker een databaseserver Microsoft Entra-beheerder is
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write Vereist om azure CLI-aanmeldingsgebruiker toe te voegen als databaseserver Microsoft Entra-beheerder
Machtiging Operation
Microsoft.DBforMySQL/flexibleServers/read Vereist voor het ophalen van gegevens van de databaseserver
Microsoft.DBforMySQL/flexibleServers/write Vereist om de door de gebruiker toegewezen beheerde identiteit toe te voegen aan de databaseserver
Microsoft.DBforMySQL/flexibleServers/firewallRules/write Vereist voor het maken van een firewallregel voor het geval het lokale IP-adres wordt geblokkeerd
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete Vereist om de firewallregel die door Service Connector is gemaakt, te herstellen om beveiligingsproblemen te voorkomen
Microsoft.DBforMySQL/flexibleServers/administrators/read Vereist om te controleren of de azure CLI-aanmeldingsgebruiker een databaseserver Microsoft Entra-beheerder is
Microsoft.DBforMySQL/flexibleServers/administrators/write Vereist om azure CLI-aanmeldingsgebruiker toe te voegen als databaseserver Microsoft Entra-beheerder
Machtiging Operation
Microsoft.Sql/servers/read Vereist voor het ophalen van gegevens van de databaseserver
Microsoft.Sql/servers/firewallRules/write Vereist voor het maken van een firewallregel voor het geval het lokale IP-adres wordt geblokkeerd
Microsoft.Sql/servers/firewallRules/delete Vereist om de firewallregel die door Service Connector is gemaakt, te herstellen om beveiligingsproblemen te voorkomen
Microsoft.Sql/servers/administrators/read Vereist om te controleren of de azure CLI-aanmeldingsgebruiker een databaseserver Microsoft Entra-beheerder is
Microsoft.Sql/servers/administrators/write Vereist om azure CLI-aanmeldingsgebruiker toe te voegen als databaseserver Microsoft Entra-beheerder

In sommige gevallen zijn de machtigingen niet vereist. Als de door Azure CLI geverifieerde gebruiker bijvoorbeeld al een Active Directory-beheerder op SQL Server is, hoeft u niet over de Microsoft.Sql/servers/administrators/write machtiging te beschikken.

Microsoft Entra ID

Als er een fout ERROR: AADSTS530003: Your device is required to be managed to access this resource.optreedt, vraagt u uw IT-afdeling om hulp bij het toevoegen van dit apparaat aan Microsoft Entra-id. Zie Microsoft Entra-gekoppelde apparaten voor meer informatie.

ServiceConnector moet toegang krijgen tot Microsoft Entra ID om informatie op te halen over uw account en de beheerde identiteit van de hostingservice. U kunt de volgende opdracht gebruiken om te controleren of uw apparaat toegang heeft tot Microsoft Entra ID:

az ad signed-in-user show

Als u zich niet interactief aanmeldt, krijgt u mogelijk ook de fout en Interactive authentication is needed. Meld u aan met de opdracht om de az login fout op te lossen.

Netwerkverbinding

Als uw databaseserver zich in virtual network bevindt, moet u ervoor zorgen dat uw omgeving waarop de Azure CLI-opdracht wordt uitgevoerd, toegang heeft tot de server in het virtuele netwerk.

Als uw databaseserver zich in virtual network bevindt, moet u ervoor zorgen dat uw omgeving waarop de Azure CLI-opdracht wordt uitgevoerd, toegang heeft tot de server in het virtuele netwerk.

Als uw databaseserver openbare toegang weigert, moet u ervoor zorgen dat uw omgeving waarop de Azure CLI-opdracht wordt uitgevoerd, toegang heeft tot de server via het privé-eindpunt.

Volgende stappen

Zie de volgende bronnen voor meer informatie over serviceconnector en verbindingen zonder wachtwoord: