Esercitazione: Creare una connessione senza password a un servizio di database tramite Service Connector

Le connessioni senza password usano identità gestite per accedere ai servizi di Azure. Con questo approccio non è necessario tenere traccia e gestire manualmente i segreti per le identità gestite. Queste attività vengono gestite internamente da Azure.

Service Connector abilita le identità gestite nei servizi di hosting di app come Azure Spring Apps, servizio app Azure e app contenitore di Azure. Service Connector configura anche i servizi di database, ad esempio Database di Azure per PostgreSQL, Database di Azure per MySQL e database SQL di Azure, per accettare le identità gestite.

In questa esercitazione verrà usata l'interfaccia della riga di comando di Azure per completare le attività seguenti:

  • Controllare l'ambiente iniziale con l'interfaccia della riga di comando di Azure.
  • Creare una connessione senza password con Service Connector.
  • Usare le variabili di ambiente o le configurazioni generate da Service Connector per accedere a un servizio di database.

Prerequisiti

Configurazione dell'ambiente

Conto

Accedere con l'interfaccia della riga di comando di Azure tramite az login. Se si usa Azure Cloud Shell o si è già connessi, confermare l'account autenticato con az account show.

Installare l'estensione senza password di Service Connector

Installare l'estensione senza password Connettore di servizi più recente per l'interfaccia della riga di comando di Azure:

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

Nota

Verificare che la versione dell'estensione "serviceconnector-passwordless" sia "2.0.2" o successiva eseguendo az version. Potrebbe essere necessario aggiornare prima l'interfaccia della riga di comando di Azure per aggiornare la versione dell'estensione.

Creare una connessione senza password

Si userà quindi app Azure Servizio come esempio per creare una connessione usando l'identità gestita.

Se si usa:

Nota

Se si usa il portale di Azure, passare al pannello Service Connector di app Azure Service, Azure Spring Apps o Azure Container Apps (App Azure Spring) e selezionare Crea per creare una connessione. Il portale di Azure comporrà automaticamente il comando e attiverà l'esecuzione del comando in Cloud Shell.

Il comando seguente dell'interfaccia della riga di comando di Azure usa un --client-type parametro, può essere java, dotnet, python e così via. Eseguire az webapp connection create postgres-flexible -h per ottenere i tipi di client supportati e scegliere quello corrispondente all'applicazione.

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

Database di Azure per MySQL : il server flessibile richiede un'identità gestita assegnata dall'utente per abilitare l'autenticazione di Microsoft Entra. Per altre informazioni, vedere Configurare l'autenticazione di Microsoft Entra per Database MySQL di Azure - Server flessibile. È possibile usare il comando seguente per creare un'identità gestita assegnata dall'utente:

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)

Importante

Dopo aver creato l'identità gestita assegnata dall'utente, chiedere all'amministratore globale o all'amministratore del ruolo con privilegi di concedere le autorizzazioni seguenti per questa identità:

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

Per altre informazioni, vedere la sezione Autorizzazioni in Autenticazione di Active Directory.

Connettere quindi l'app a un database MySQL con un'identità gestita assegnata dal sistema usando la funzionalità Connettore servizio.

Il comando seguente dell'interfaccia della riga di comando di Azure usa un parametro --client-type. az webapp connection create mysql-flexible -h Eseguire per ottenere i tipi di client supportati e scegliere quello che corrisponde all'applicazione.

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

Il comando seguente dell'interfaccia della riga di comando di Azure usa un parametro --client-type. az webapp connection create sql -h Eseguire per ottenere i tipi di client supportati e scegliere quello che corrisponde all'applicazione.

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

Questo comando di Connettore servizio completa le attività seguenti in background:

  • Abilitare l'identità gestita assegnata dal sistema o assegnare un'identità utente per l'app $APPSERVICE_NAME ospitata da app Azure Servizio/App Spring di Azure/App Azure Container.
  • Abilitare Microsoft Entra Authentication per il server di database se non è abilitato in precedenza.
  • Impostare l'amministratore di Microsoft Entra sull'utente connesso corrente.
  • Aggiungere un utente del database per l'identità gestita assegnata dal sistema, l'identità gestita assegnata dall'utente o l'entità servizio. Concedere a questo utente tutti i privilegi del database $DATABASE_NAME. Il nome utente è disponibile nella stringa di connessione nell'output del comando precedente.
  • Impostare le configurazioni denominate AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRING o AZURE_SQL_CONNECTIONSTRING sulla risorsa di Azure in base al tipo di database.
    • Per il Servizio app, le configurazioni vengono impostate nel pannello Impostazioni app.
    • Per Spring Apps, le configurazioni vengono impostate all'avvio dell'applicazione.
    • Per App contenitore, le configurazioni vengono impostate sulle variabili di ambiente. È possibile ottenere tutte le configurazioni e i relativi valori nel pannello Service Connector nel portale di Azure.

Service Connector assegnerà i privilegi seguenti all'utente, è possibile revocarli e modificare i privilegi in base alle esigenze.

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

Connettersi a un database con l'autenticazione di Microsoft Entra

Dopo aver creato la connessione, è possibile usare il stringa di connessione nell'applicazione per connettersi al database con l'autenticazione Microsoft Entra. Ad esempio, è possibile usare le soluzioni seguenti per connettersi al database con l'autenticazione di Microsoft Entra.

Per .NET non è disponibile un plug-in o una libreria per supportare connessioni senza password. È possibile ottenere un token di accesso per l'identità gestita o l'entità servizio usando la libreria client come Azure.Identity. È quindi possibile usare il token di accesso come password per connettersi al database. Quando si usa il codice seguente, rimuovere il commento dalla parte del frammento di codice per il tipo di autenticazione che si vuole usare.

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

Successivamente, se si sono create tabelle e sequenze nel server flessibile PostgreSQL prima di usare Connettore di servizi, è necessario connettersi come proprietario e concedere l'autorizzazione alle <aad-username> create da Connettore di servizi. Il nome utente della stringa di connessione o della configurazione impostata da Connettore di servizi dovrebbe essere simile a aad_<connection name>. Se si usa il portale di Azure, selezionare il pulsante Espandi accanto alla colonna Service Type e ottenere il valore. Se si usa l'interfaccia della riga di comando di Azure, controllare configurations nell'output del comando dell'interfaccia della riga di comando.

Eseguire quindi la query per concedere l'autorizzazione

az extension add --name rdbms-connect

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"<aad-username>\";GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"<aad username>\";"

<owner-username> e <owner-password> sono i proprietari della tabella esistente che può concedere autorizzazioni ad altri utenti. <aad-username> è l'utente creato da Connettore di servizi. Sostituirlo con il valore effettivo.

Convalidare il risultato tramite il comando:

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

Per .NET non è disponibile un plug-in o una libreria per supportare connessioni senza password. È possibile ottenere un token di accesso per l'identità gestita o l'entità servizio usando la libreria client come Azure.Identity. È quindi possibile usare il token di accesso come password per connettersi al database. Quando si usa il codice seguente, rimuovere il commento dalla parte del frammento di codice per il tipo di autenticazione che si vuole usare.

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

Per altri esempi di codice, vedere Connettersi ai database di Azure dal servizio app senza segreti usando un'identità gestita.

  1. Installare le dipendenze.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Ottenere la stringa di connessione del database SQL di Azure dalla variabile di ambiente aggiunta dal connettore di servizi.

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

    Per altre informazioni, vedere Usare l’autenticazione con identità gestita di Azure Active Directory.

Per altre informazioni, vedere Home page per la programmazione client per Microsoft SQL Server.

Distribuire l'applicazione in un servizio di hosting di Azure

Distribuire infine l'applicazione in un servizio di hosting di Azure. Il servizio di origine può usare un'identità gestita per connettersi al database di destinazione in Azure.

Per app Azure Servizio, è possibile controllare il documento per scegliere una modalità di distribuzione, vedere Avvio rapido: Distribuire un'app Web ASP.NET.

È quindi possibile controllare il log o chiamare l'applicazione per verificare se è in grado di connettersi correttamente al database di Azure.

Risoluzione dei problemi

Autorizzazione

Se si verificano errori correlati alle autorizzazioni, verificare che l'utente connesso all'interfaccia della riga di comando di Azure con il comando az account show. Assicurarsi di accedere con l'account corretto. Verificare quindi di avere le autorizzazioni seguenti che potrebbero essere necessarie per creare una connessione senza password con Service Connector.

Autorizzazione Operazione
Microsoft.DBforPostgreSQL/flexibleServers/read Obbligatorio per ottenere informazioni sul server di database
Microsoft.DBforPostgreSQL/flexibleServers/write Obbligatorio per abilitare l'autenticazione di Microsoft Entra per il server di database
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write Obbligatorio per creare una regola del firewall nel caso in cui l'indirizzo IP locale sia bloccato
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete Obbligatorio per ripristinare la regola del firewall creata da Service Connector per evitare problemi di sicurezza
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read Obbligatorio per verificare se l'utente di accesso dell'interfaccia della riga di comando di Azure è un amministratore di Microsoft Entra
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write Obbligatorio per aggiungere l'utente di accesso dell'interfaccia della riga di comando di Azure come amministratore di Microsoft Entra del server di database
Autorizzazione Operazione
Microsoft.DBforMySQL/flexibleServers/read Obbligatorio per ottenere informazioni sul server di database
Microsoft.DBforMySQL/flexibleServers/write Obbligatorio per aggiungere l'identità gestita assegnata dall'utente al server di database
Microsoft.DBforMySQL/flexibleServers/firewallRules/write Obbligatorio per creare una regola del firewall nel caso in cui l'indirizzo IP locale sia bloccato
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete Obbligatorio per ripristinare la regola del firewall creata da Service Connector per evitare problemi di sicurezza
Microsoft.DBforMySQL/flexibleServers/administrators/read Obbligatorio per verificare se l'utente di accesso dell'interfaccia della riga di comando di Azure è un amministratore di Microsoft Entra
Microsoft.DBforMySQL/flexibleServers/administrators/write Obbligatorio per aggiungere l'utente di accesso dell'interfaccia della riga di comando di Azure come amministratore di Microsoft Entra del server di database
Autorizzazione Operazione
Microsoft.Sql/servers/read Obbligatorio per ottenere informazioni sul server di database
Microsoft.Sql/servers/firewallRules/write Obbligatorio per creare una regola del firewall nel caso in cui l'indirizzo IP locale sia bloccato
Microsoft.Sql/servers/firewallRules/delete Obbligatorio per ripristinare la regola del firewall creata da Service Connector per evitare problemi di sicurezza
Microsoft.Sql/servers/administrators/read Obbligatorio per verificare se l'utente di accesso dell'interfaccia della riga di comando di Azure è un amministratore di Microsoft Entra
Microsoft.Sql/servers/administrators/write Obbligatorio per aggiungere l'utente di accesso dell'interfaccia della riga di comando di Azure come amministratore di Microsoft Entra del server di database

In alcuni casi, le autorizzazioni non sono necessarie. Ad esempio, se l'utente autenticato dall'interfaccia della riga di comando di Azure è già un amministratore di Active Directory in SQL Server, non è necessario disporre dell'autorizzazione Microsoft.Sql/servers/administrators/write .

Microsoft Entra ID

Se viene visualizzato un errore ERROR: AADSTS530003: Your device is required to be managed to access this resource., chiedere al reparto IT di assistenza per l'aggiunta di questo dispositivo all'ID Microsoft Entra. Per altre informazioni, vedere Dispositivi aggiunti a Microsoft Entra.

Service Connector deve accedere all'ID Microsoft Entra per ottenere informazioni sull'account e sull'identità gestita del servizio di hosting. È possibile usare il comando seguente per verificare se il dispositivo può accedere all'ID Microsoft Entra:

az ad signed-in-user show

Se non si esegue l'accesso in modo interattivo, è anche possibile che venga visualizzato l'errore e Interactive authentication is needed. Per risolvere l'errore, accedere con il az login comando .

Connettività di rete

Se il server di database si trova in Rete virtuale, assicurarsi che l'ambiente che esegue il comando dell'interfaccia della riga di comando di Azure possa accedere al server nel Rete virtuale.

Se il server di database si trova in Rete virtuale, assicurarsi che l'ambiente che esegue il comando dell'interfaccia della riga di comando di Azure possa accedere al server nel Rete virtuale.

Se il server di database non consente l'accesso pubblico, assicurarsi che l'ambiente che esegue il comando dell'interfaccia della riga di comando di Azure possa accedere al server tramite l'endpoint privato.

Passaggi successivi

Per altre informazioni su Service Connector e connessioni senza password, vedere le risorse seguenti: