Dela via


Självstudie: Skapa en lösenordslös anslutning till en databastjänst via Service Connector

Lösenordslösa anslutningar använder hanterade identiteter för att få åtkomst till Azure-tjänster. Med den här metoden behöver du inte spåra och hantera hemligheter för hanterade identiteter manuellt. Dessa uppgifter hanteras på ett säkert sätt internt av Azure.

Service Connector möjliggör hanterade identiteter i appvärdtjänster som Azure Spring Apps, Azure App Service och Azure Container Apps. Service Connector konfigurerar även databastjänster, till exempel Azure Database for PostgreSQL, Azure Database for MySQL och Azure SQL Database, för att acceptera hanterade identiteter.

I den här självstudien använder du Azure CLI för att utföra följande uppgifter:

  • Kontrollera din första miljö med Azure CLI.
  • Skapa en lösenordslös anslutning med Service Connector.
  • Använd miljövariabler eller konfigurationer som genereras av Service Connector för att få åtkomst till en databastjänst.

Förutsättningar

Konfigurera din miljö

Konto

Logga in med Azure CLI via az login. Om du använder Azure Cloud Shell eller redan är inloggad bekräftar du ditt autentiserade konto med az account show.

Installera det lösenordslösa tillägget för Service Connector

Installera det senaste lösenordslösa tillägget för Service Connector för Azure CLI:

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

Kommentar

Kontrollera att tillägget "serviceconnector-passwordless" är "2.0.2" eller senare genom att köra az version. Du kan behöva uppgradera Azure CLI först för att uppgradera tilläggsversionen.

Skapa en lösenordslös anslutning

Sedan använder vi Azure App Service som exempel för att skapa en anslutning med hjälp av hanterad identitet.

Om du använder:

Kommentar

Om du använder Azure-portalen går du till bladet Service Connector i Azure App Service, Azure Spring Apps eller Azure Container Apps och väljer Skapa för att skapa en anslutning. Azure-portalen skapar automatiskt kommandot åt dig och utlöser kommandokörningen i Cloud Shell.

Följande Azure CLI-kommando använder en --client-type parameter, det kan vara java, dotnet, python osv. Kör az webapp connection create postgres-flexible -h för att hämta de klienttyper som stöds och välj den som matchar ditt program.

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 – Flexibel server kräver en användartilldelad hanterad identitet för att aktivera Microsoft Entra-autentisering. Mer information finns i Konfigurera Microsoft Entra-autentisering för Azure Database for MySQL – flexibel server. Du kan använda följande kommando för att skapa en användartilldelad hanterad identitet:

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)

Viktigt!

När du har skapat den användartilldelade hanterade identiteten ber du din globala administratör eller privilegierade rolladministratör att bevilja följande behörigheter för den här identiteten:

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

Mer information finns i avsnittet Behörigheter i Active Directory-autentisering.

Anslut sedan din app till en MySQL-databas med en systemtilldelad hanterad identitet med hjälp av Service Connector.

Följande Azure CLI-kommando använder en --client-type parameter. az webapp connection create mysql-flexible -h Kör för att hämta de klienttyper som stöds och välj den som matchar ditt program.

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

Följande Azure CLI-kommando använder en --client-type parameter. az webapp connection create sql -h Kör för att hämta de klienttyper som stöds och välj den som matchar ditt program.

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

Det här service connector-kommandot slutför följande uppgifter i bakgrunden:

  • Aktivera systemtilldelad hanterad identitet eller tilldela en användaridentitet för appen $APPSERVICE_NAME som hanteras av Azure App Service/Azure Spring Apps/Azure Container Apps.
  • Aktivera Microsoft Entra-autentisering för databasservern om den inte är aktiverad tidigare.
  • Ange Microsoft Entra-administratören till den aktuella inloggade användaren.
  • Lägg till en databasanvändare för den systemtilldelade hanterade identiteten, användartilldelad hanterad identitet eller tjänstens huvudnamn. Bevilja alla behörigheter för databasen $DATABASE_NAME till den här användaren. Användarnamnet finns i niska veze i föregående kommandoutdata.
  • Ange konfigurationer med namnet AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRINGeller AZURE_SQL_CONNECTIONSTRING till Azure-resursen baserat på databastypen.
    • För App Service anges konfigurationerna på bladet Appinställningar .
    • För Spring Apps anges konfigurationerna när programmet startas.
    • För Container Apps är konfigurationerna inställda på miljövariablerna. Du kan hämta alla konfigurationer och deras värden på bladet Tjänstanslutning i Azure-portalen.

Service Connector tilldelar följande behörigheter till användaren. Du kan återkalla dem och justera behörigheterna baserat på dina krav.

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";

Ansluta till en databas med Microsoft Entra-autentisering

När du har skapat anslutningen kan du använda niska veze i ditt program för att ansluta till databasen med Microsoft Entra-autentisering. Du kan till exempel använda följande lösningar för att ansluta till databasen med Microsoft Entra-autentisering.

För .NET finns det inget plugin-program eller bibliotek som stöder lösenordslösa anslutningar. Du kan hämta en åtkomsttoken för den hanterade identiteten eller tjänstens huvudnamn med hjälp av klientbibliotek som Azure.Identity. Sedan kan du använda åtkomsttoken som lösenord för att ansluta till databasen. När du använder koden nedan avkommentarer du delen av kodfragmentet för den autentiseringstyp som du vill använda.

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();
}

Om du sedan har skapat tabeller och sekvenser i En flexibel PostgreSQL-server innan du använder Service Connector, måste du ansluta som ägare och bevilja behörighet till skapad <aad-username> av Service Connector. Användarnamnet från niska veze eller konfigurationsuppsättningen i Service Connector bör se ut som aad_<connection name>. Om du använder Azure-portalen väljer du knappen expandera bredvid Service Type kolumnen och hämtar värdet. Om du använder Azure CLI kontrollerar configurations du CLI-kommandoutdata.

Kör sedan frågan för att bevilja behörighet

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>\";"

Och <owner-username> <owner-password> är ägare till den befintliga tabellen som kan bevilja behörigheter till andra. <aad-username> är användaren som skapats av Service Connector. Ersätt dem med det faktiska värdet.

Verifiera resultatet med kommandot :

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

För .NET finns det inget plugin-program eller bibliotek som stöder lösenordslösa anslutningar. Du kan hämta en åtkomsttoken för den hanterade identiteten eller tjänstens huvudnamn med hjälp av klientbibliotek som Azure.Identity. Sedan kan du använda åtkomsttoken som lösenord för att ansluta till databasen. När du använder koden nedan avkommentarer du delen av kodfragmentet för den autentiseringstyp som du vill använda.

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

Fler kodexempel finns i Ansluta till Azure-databaser från App Service utan hemligheter med hjälp av en hanterad identitet.

  1. Installera beroenden.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Hämta Azure SQL Database-niska veze från miljövariabeln som lagts till av Service Connector.

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

    Mer information finns i Använda Active Directory-hanterad identitetsautentisering.

Mer information finns på startsidan för klientprogrammering till Microsoft SQL Server.

Distribuera programmet till en Azure-värdtjänst

Distribuera slutligen ditt program till en Azure-värdtjänst. Källtjänsten kan använda en hanterad identitet för att ansluta till måldatabasen i Azure.

För Azure App Service kan du kontrollera dokumentet för att välja ett sätt att distribuera. Mer information finns i Snabbstart: Distribuera en ASP.NET webbapp.

Sedan kan du kontrollera loggen eller anropa programmet för att se om det kan ansluta till Azure-databasen.

Felsökning

Behörighet

Om du stöter på behörighetsrelaterade fel bekräftar du den inloggade Azure CLI-användaren med kommandot az account show. Kontrollera att du loggar in med rätt konto. Bekräfta sedan att du har följande behörigheter som kan krävas för att skapa en lösenordslös anslutning med Service Connector.

Behörighet Åtgärd
Microsoft.DBforPostgreSQL/flexibleServers/read Krävs för att hämta information om databasservern
Microsoft.DBforPostgreSQL/flexibleServers/write Krävs för att aktivera Microsoft Entra-autentisering för databasserver
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write Krävs för att skapa brandväggsregeln om den lokala IP-adressen blockeras
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete Krävs för att återställa brandväggsregeln som skapats av Service Connector för att undvika säkerhetsproblem
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read Krävs för att kontrollera om Azure CLI-inloggningsanvändare är en Microsoft Entra-administratör för databasservern
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write Krävs för att lägga till Azure CLI-inloggningsanvändare som databasservern Microsoft Entra-administratör
Behörighet Åtgärd
Microsoft.DBforMySQL/flexibleServers/read Krävs för att hämta information om databasservern
Microsoft.DBforMySQL/flexibleServers/write Krävs för att lägga till den angivna användartilldelade hanterade identiteten till databasservern
Microsoft.DBforMySQL/flexibleServers/firewallRules/write Krävs för att skapa brandväggsregeln om den lokala IP-adressen blockeras
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete Krävs för att återställa brandväggsregeln som skapats av Service Connector för att undvika säkerhetsproblem
Microsoft.DBforMySQL/flexibleServers/administrators/read Krävs för att kontrollera om Azure CLI-inloggningsanvändare är en Microsoft Entra-administratör för databasservern
Microsoft.DBforMySQL/flexibleServers/administrators/write Krävs för att lägga till Azure CLI-inloggningsanvändare som databasservern Microsoft Entra-administratör
Behörighet Åtgärd
Microsoft.Sql/servers/read Krävs för att hämta information om databasservern
Microsoft.Sql/servers/firewallRules/write Krävs för att skapa brandväggsregeln om den lokala IP-adressen blockeras
Microsoft.Sql/servers/firewallRules/delete Krävs för att återställa brandväggsregeln som skapats av Service Connector för att undvika säkerhetsproblem
Microsoft.Sql/servers/administrators/read Krävs för att kontrollera om Azure CLI-inloggningsanvändare är en Microsoft Entra-administratör för databasservern
Microsoft.Sql/servers/administrators/write Krävs för att lägga till Azure CLI-inloggningsanvändare som databasservern Microsoft Entra-administratör

I vissa fall krävs inte behörigheterna. Om den Azure CLI-autentiserade användaren till exempel redan är Active Directory-administratör på SQL-servern behöver du inte ha behörigheten Microsoft.Sql/servers/administrators/write .

Microsoft Entra ID

Om du får ett fel ERROR: AADSTS530003: Your device is required to be managed to access this resource.ber du IT-avdelningen om hjälp med att ansluta den här enheten till Microsoft Entra-ID. Mer information finns i Microsoft Entra-anslutna enheter.

Service Connector måste ha åtkomst till Microsoft Entra-ID för att få information om ditt konto och din hanterade identitet för värdtjänsten. Du kan använda följande kommando för att kontrollera om enheten har åtkomst till Microsoft Entra-ID:

az ad signed-in-user show

Om du inte loggar in interaktivt kan du också få felet och Interactive authentication is needed. Lös felet genom att logga in med az login kommandot .

Nätverksanslutningar

Om databasservern finns i virtuellt nätverk kontrollerar du att din miljö som kör Azure CLI-kommandot kan komma åt servern i det virtuella nätverket.

Om databasservern finns i virtuellt nätverk kontrollerar du att din miljö som kör Azure CLI-kommandot kan komma åt servern i det virtuella nätverket.

Om databasservern inte tillåter offentlig åtkomst kontrollerar du att din miljö som kör Azure CLI-kommandot kan komma åt servern via den privata slutpunkten.

Nästa steg

Mer information om Service Connector och lösenordslösa anslutningar finns i följande resurser: