Condividi tramite


Esercitazione: Connettersi ai database di Azure da Servizio app senza segreti usando un'identità gestita

Il Servizio app fornisce un servizio di hosting Web ad alta scalabilità e con funzioni di auto-correzione in Azure. Offre anche un'identità gestita per l'app, una soluzione chiavi in mano per proteggere l'accesso ai database di Azure, tra cui:

Nota

Questa esercitazione non include indicazioni per Azure Cosmos DB, che supporta l'autenticazione di Microsoft Entra in modo differente. Per altre informazioni, vedere la documentazione di Azure Cosmos DB, ad esempio Usare identità gestite assegnate dal sistema per accedere ai dati di Azure Cosmos DB.

Le identità gestite nel servizio app rendono l'app più sicura eliminando i segreti dall'app, ad esempio le credenziali nelle stringhe di connessione. Questa esercitazione illustra come connettersi ai database indicati in precedenza dal Servizio app usando identità gestite.

Contenuto dell'esercitazione:

  • Configurare un utente di Microsoft Entra come amministratore per il database di Azure.
  • Connettersi al database come e di Microsoft Entra.
  • Configurare un'identità gestita assegnata dal sistema o dall'utente per un'app del Servizio app.
  • Concedere all'identità gestita l'accesso al database.
  • Connettersi al database di Azure dal codice (.NET Framework 4.8, .NET 6, Node.js, Python, Java) usando un'identità gestita.
  • Connettersi al database di Azure dall'ambiente di sviluppo usando l'utente Microsoft Entra.

Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.

Prerequisiti

  • Creare un'app nel Servizio app basata su .NET, Node.js, Python o Java.
  • Creare un server di database con Database SQL di Azure, Database di Azure per MySQL o Database di Azure per PostgreSQL.
  • È necessario avere familiarità con il modello di connettività standard (con nome utente e password) e potersi connettere correttamente dall'app del Servizio app al database preferito.

Preparare l'ambiente per l'interfaccia della riga di comando di Azure.

1. Installare l'estensione senza password del Connettore di servizi

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.

2. Creare una connessione senza password

Creare quindi una connessione senza password con Connettore di servizi.

Suggerimento

Il portale di Azure consente di comporre i comandi seguenti. Nel portale di Azure andare alla risorsa Servizio app di Azure, selezionare Connettore di servizi nel menu a sinistra seguito da Crea. Compilare il modulo con tutti i parametri obbligatori. Azure genera automaticamente il comando di creazione della connessione, che è possibile copiare da usare nell'interfaccia della riga di comando o eseguire in Azure Cloud Shell.

Il comando seguente dell'interfaccia della riga di comando di Azure usa un parametro --client-type.

  1. Facoltativamente, eseguire az webapp connection create sql -h per ottenere i tipi di client supportati.

  2. Scegliere un tipo di client ed eseguire il comando corrispondente. Sostituire i segnaposto seguenti con le proprie informazioni.

    az webapp connection create sql \
        --resource-group <group-name> \
        --name <server-name> \
        --target-resource-group <sql-group-name> \
        --server <sql-name> \
        --database <database-name> \
        --user-identity client-id=<client-id> subs-id=<subscription-id> \
        --client-type <client-type>
    

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

  • Abilitare l'identità gestita assegnata dal sistema oppure assegnare un'identità utente per l'app <server-name> ospitata dal Servizio app di Azure.
  • Impostare l'amministratore di Microsoft Entra sull'utente connesso corrente.
  • Aggiungere un utente del database per l'identità gestita assegnata dal sistema o dall'utente. 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.

Se si verificano problemi durante la creazione di una connessione, vedere Risoluzione dei problemi per assistenza.

3. Modificare il codice

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

    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. Per altri esempi di codice, vedere Creare una connessione senza password a un servizio di database tramite Connettore di servizi.

4. Configurare l'ambiente di sviluppo

Questo codice di esempio usa DefaultAzureCredential per ottenere un token utilizzabile per il database di Azure dall'ID Microsoft Entra e quindi lo aggiunge alla connessione al database. Anche se è possibile personalizzare DefaultAzureCredential, è già versatile per impostazione predefinita. Ottiene un token dall'utente Microsoft Entra connesso o da un'identità gestita, a seconda che venga eseguito localmente nell'ambiente di sviluppo o nel Servizio app.

Senza ulteriori modifiche, il codice è pronto per l'esecuzione in Azure. Per eseguire il debug del codice in locale, tuttavia, l'ambiente di sviluppo richiede un utente connesso a Microsoft Entra. In questo passaggio si configura l'ambiente preferito accedendo con l'utente di Microsoft Entra.

  1. Visual Studio per Windows è integrato con l'autenticazione di Microsoft Entra. Per abilitare lo sviluppo e il debug in Visual Studio, aggiungere l'utente Microsoft Entra in Visual Studio selezionando File>Impostazioni account nel menu e facendo clic su Accedi o Aggiungi.

  2. Per impostare l'utente di Microsoft Entra per l'autenticazione dei servizi di Azure, scegliere Strumenti>Opzioni dal menu, quindi selezionare Azure Service Authentication (Autenticazione servizi di Azure)>Selezione account. Selezionare l'utente di Microsoft Entra aggiunto, quindi selezionare OK.

Per altre informazioni sulla configurazione dell'ambiente di sviluppo per l'autenticazione di Microsoft Entra, vedere Libreria client di Azure Identity per .NET.

A questo punto è possibile iniziare a sviluppare l'app ed eseguirne il debug con il database SQL come back-end, usando l'autenticazione di Microsoft Entra.

5. Testare e pubblicare

  1. Eseguire il codice nell'ambiente di sviluppo. Il codice usa l'utente connesso di Microsoft Entra nell'ambiente per connettersi al database back-end. L'utente può accedere al database perché è configurato come amministratore di Microsoft Entra per il database.

  2. Pubblicare il codice in Azure usando il metodo di pubblicazione preferito. Nel Servizio app il codice usa l'identità gestita dell'app per connettersi al database back-end.

Domande frequenti

L'identità gestita supporta SQL Server?

Sì. Per altre informazioni, vedi:

Viene visualizzato l'errore Login failed for user '<token-identified principal>'.

L'identità gestita per cui si sta tentando di richiedere un token non è autorizzata ad accedere al database di Azure.

Sono state apportate modifiche all'autenticazione del Servizio app o alla registrazione dell'app associata. Perché si ottiene ancora il vecchio token?

Anche i servizi back-end delle identità gestite gestiscono una cache di token che aggiorna il token per una risorsa di destinazione solo quando scade. Se si tenta di modificare la configurazione dopo aver provato a ottenere un token con l'applicazione, non si otterrà un nuovo token con le autorizzazioni aggiornate fino alla scadenza del token memorizzato nella cache. Il modo migliore per risolvere questo problema consiste nel testare le modifiche con una nuova finestra InPrivate (Edge)/privata (Safari)/Incognito (Chrome). In questo modo, si è sicuri di iniziare da una nuova sessione autenticata.

Come si aggiunge l'identità gestita a un gruppo Microsoft Entra?

Se lo si desidera, aggiungere l'identità a un gruppo Microsoft Entra, quindi concedere l'accesso al gruppo Microsoft Entra invece che all'identità. Ad esempio, i comandi seguenti aggiungono l'identità gestita del passaggio precedente a un nuovo gruppo denominato 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

Per concedere le autorizzazioni di database per un gruppo Microsoft Entra, vedere la documentazione relativa al tipo di database corrispondente.

Viene visualizzato l'errore SSL connection is required. Please specify SSL options and retry.

La connessione al database di Azure richiede impostazioni aggiuntive ed esula dall'ambito di questa esercitazione. Per ulteriori informazioni, vedere uno degli link seguenti:

Configurare la connettività TLS in Database di Azure per PostgreSQL - Server singoloConfigurare la connettività SSL nell'applicazione per connettersi in modo sicuro a Database di Azure per MySQL

Ho creato l'app con il modello App Web + Database e ora non posso configurare una connessione identità gestita con i comandi di Connettore di servizi.

Connettore di servizi richiede l'accesso di rete al database per concedere l'accesso per l'identità dell'app. Quando si crea un'architettura di database e app sicura per impostazione predefinita nel portale di Azure con il modello App Web + Database, l'architettura blocca l'accesso alla rete al database e consente solo le connessioni dall'interno della rete virtuale. Ciò vale anche per Azure Cloud Shell. Tuttavia, è possibile distribuire Cloud Shell nella rete virtuale, quindi eseguire il comando Connettore di servizi in tale Cloud Shell.

Passaggi successivi

Contenuto dell'esercitazione:

  • Configurare un utente di Microsoft Entra come amministratore per il database di Azure.
  • Connettersi al database come e di Microsoft Entra.
  • Configurare un'identità gestita assegnata dal sistema o dall'utente per un'app del Servizio app.
  • Concedere all'identità gestita l'accesso al database.
  • Connettersi al database di Azure dal codice (.NET Framework 4.8, .NET 6, Node.js, Python, Java) usando un'identità gestita.
  • Connettersi al database di Azure dall'ambiente di sviluppo usando l'utente Microsoft Entra.