Share via


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

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 Connessione or abilita le identità gestite nei servizi di hosting di app come Azure Spring Apps, app Azure Service e App Azure Container. Service Connessione or 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 Connessione or.
  • Usare le variabili di ambiente o le configurazioni generate da Service Connessione or 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 del servizio Connessione or

Installare l'estensione senza password del servizio Connessione or per l'interfaccia della riga di comando di Azure:

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

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 la portale di Azure, passare al pannello Service Connessione or (Service Connessione or) di app Azure Service (Servizio), Azure Spring Apps (App Azure Spring) o Azure Container Apps (App Azure Container) 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 . az webapp connection create postgres-flexible -h Eseguire per ottenere i tipi di client supportati e scegliere quello che corrisponde 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 java

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 di Azure per MySQL - 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'Amministrazione istrator globale o al ruolo con privilegi Amministrazione istrator di concedere le autorizzazioni seguenti per questa identità:

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

Per altre informazioni, vedere la sezione Autorizzazioni dell'autenticazione di Active Directory.

Connettere quindi l'app a un database MySQL con un'identità gestita assegnata dal sistema usando Service Connessione or.

Il comando seguente dell'interfaccia della riga di comando di Azure usa un --client-type parametro . 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 --client-type parametro . 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 service Connessione or 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.
  • 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_CONNECTIONSTRINGo AZURE_SQL_CONNECTIONSTRING sulla risorsa di Azure in base al tipo di database.
    • Per servizio app, le configurazioni vengono impostate nel pannello App Impostazioni.
    • 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 Connessione or nel portale di Azure.

Connessione 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 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");
//     }
// );

// 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 sono state create tabelle e sequenze nel server flessibile PostgreSQL prima di usare Service Connessione or, è necessario connettersi come proprietario e concedere l'autorizzazione a <aad-username> creata da Service Connessione or. Il nome utente del stringa di connessione o della configurazione impostato da Service Connessione or dovrebbe essere simile aad_<connection name>a . Se si usa il portale di Azure, selezionare il pulsante di espansione accanto alla Service Type colonna e ottenere il valore. Se si usa l'interfaccia della riga di comando di Azure, archiviare configurations l'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> è il proprietario della tabella esistente che può concedere autorizzazioni ad altri utenti. <aad-username>è l'utente creato da Service Connessione or. Sostituirli con il valore effettivo.

Convalidare il risultato con 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 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");
//     });

// 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 Connessione ai database di Azure da servizio app senza segreti usando un'identità gestita.

  1. Installare le dipendenze.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Ottenere il database SQL di Azure stringa di connessione dalla variabile di ambiente aggiunta da Service Connessione or.

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

    Per altre informazioni, vedere Uso dell'autenticazione dell'identità gestita di Active Directory.

Per altre informazioni, vedere Home page per la programmazione client in 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 distribuire il codice dell'applicazione tramite il az webapp deploy comando . Per altre informazioni, vedere Guida introduttiva: 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 Connessione or.

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 Necessario per ripristinare la regola del firewall creata dal Connessione or del servizio 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 Necessario per ripristinare la regola del firewall creata dal Connessione or del servizio 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 Necessario per ripristinare la regola del firewall creata dal Connessione or del servizio 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'istanza di Active Directory Amministrazione istrator in SQL Server, non è necessario disporre dell'autorizzazioneMicrosoft.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 Connessione or 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 Connessione or e connessioni senza password, vedere le risorse seguenti: