Esercitazione: Connessione per database SQL da servizio app .NET 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 al database SQL di Azure e ad altri servizi di Azure. Le identità gestite nel servizio app rendono l'app più sicura eliminando i segreti dall'app, ad esempio le credenziali nelle stringhe di connessione. In questa esercitazione si aggiunge l'identità gestita all'app Web di esempio compilata in una delle esercitazioni seguenti:

Al termine, l'app di esempio si connetterà al database SQL in modo sicuro senza che siano necessari nome utente e password.

Diagramma dell'architettura per lo scenario di esercitazione.

Nota

Le procedure descritte in questa esercitazione supportano le versioni seguenti:

  • .NET Framework 4.8 e versioni successive
  • .NET 6.0 e versioni successive

Per indicazioni su Database di Azure per MySQL o Database di Azure per PostgreSQL in altri framework di linguaggio (Node.js, Python e Java), vedere Esercitazione: Connessione ai database di Azure da servizio app senza segreti usando un'identità gestita.

Contenuto dell'esercitazione:

  • Abilitare le identità gestite
  • Concedere all'identità gestita l'accesso al database SQL
  • Configurare Entity Framework per l'uso dell'autenticazione di Microsoft Entra con database SQL
  • Connessione a database SQL da Visual Studio usando l'autenticazione Di Microsoft Entra

Nota

L'autenticazione di Microsoft Entra è diversa dalla autenticazione di Windows integrata in Active Directory locale (AD DS). Active Directory Domain Services e Microsoft Entra ID usano protocolli di autenticazione completamente diversi. Per altre informazioni, vedere la documentazione di Microsoft Entra Domain Services.

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

Prerequisiti

Questo articolo continua dove è stato interrotto in una delle esercitazioni seguenti:

Se non è già stato fatto, seguire prima una delle due esercitazioni. In alternativa, è possibile adattare le procedure alla propria app .NET con un database SQL.

Per eseguire il debug dell'app usando il database SQL come back-end, assicurarsi di aver consentito la connessione client dal computer. In caso contrario, aggiungere l'indirizzo IP del client seguendo la procedura descritta in Gestire regole del firewall IP a livello di server tramite il portale di Azure.

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

1. Concedere l'accesso al database all'utente di Microsoft Entra

Prima di tutto, abilitare l'autenticazione di Microsoft Entra per database SQL assegnando un utente di Microsoft Entra come amministratore del server. Questo utente è diverso dall'account Microsoft usato per effettuare l'iscrizione alla sottoscrizione di Azure. Deve essere un utente creato, importato, sincronizzato o invitato in Microsoft Entra ID. Per altre informazioni sugli utenti autorizzati di Microsoft Entra, vedere Funzionalità e limitazioni di Microsoft Entra in database SQL.

  1. Se il tenant di Microsoft Entra non ha ancora un utente, crearne uno seguendo la procedura descritta in Aggiungere o eliminare utenti usando Microsoft Entra ID.

  2. Trovare l'ID oggetto dell'utente di Microsoft Entra usando az ad user list e sostituire <user-principal-name>. Il risultato viene salvato in una variabile.

    $azureaduser=(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query '[].id' --output tsv)
    

    Suggerimento

    Per visualizzare l'elenco di tutti i nomi delle entità utente in Microsoft Entra ID, eseguire az ad user list --query '[].userPrincipalName'.

  3. Aggiungere questo utente di Microsoft Entra come amministratore di Active Directory usando az sql server ad-admin create il comando in Cloud Shell. Nel comando seguente sostituire <server-name> con il nome del server (senza il .database.windows.net suffisso).

    az sql server ad-admin create --resource-group myResourceGroup --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    

Per altre informazioni sull'aggiunta di un amministratore di Active Directory, vedere Effettuare il provisioning di un amministratore di Microsoft Entra per il server

2. Configurare l'ambiente di sviluppo

  1. Visual Studio per Windows è integrato con l'autenticazione Microsoft Entra. Per abilitare lo sviluppo e il debug in Visual Studio, aggiungere l'utente Microsoft Entra in Visual Studio selezionando Account file>Impostazioni dal menu e selezionare Accedi o Aggiungi.

  2. Per impostare l'utente di Microsoft Entra per l'autenticazione del servizio di Azure, selezionare Strumenti>Opzioni dal menu e quindi selezionare Selezione dell'account di autenticazione del>servizio di Azure. Selezionare l'utente di Microsoft Entra aggiunto e selezionare OK.

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

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

3. Modificare il progetto

Nota

Microsoft.Azure.Services.AppAuthentication non è più consigliabile usare con il nuovo SDK di Azure. Viene sostituito con la nuova libreria client di Identità di Azure disponibile per .NET, Java, TypeScript e Python e deve essere usata per tutti i nuovi sviluppi. Informazioni su come eseguire la migrazione a Azure Identitysono disponibili qui: AppAuthentication to Azure.Identity Migration Guidance (AppAuthentication to Azure.Identity Migration Guidance).

I passaggi da seguire per il progetto dipendono dal fatto che si usi Entity Framework Core (impostazione predefinita per ASP.NET Core) o Entity Framework (impostazione predefinita per ASP.NET).

  1. In Visual Studio aprire la console di Gestione pacchetti e aggiungere il pacchetto NuGet Microsoft.Data.SqlClient:

    Install-Package Microsoft.Data.SqlClient -Version 5.1.0
    
  2. Nell'esercitazione ASP.NET Core e database SQL il MyDbConnection stringa di connessione in appsettings.json non viene ancora usato. L'ambiente locale e l'ambiente Azure ottengono entrambi stringa di connessione dalle rispettive variabili di ambiente per mantenere i segreti di connessione fuori dal file di origine. Ma ora con l'autenticazione di Active Directory non sono presenti altri segreti. In appsettings.json sostituire il valore della stringa di connessione MyDbConnection con:

    "Server=tcp:<server-name>.database.windows.net;Authentication=Active Directory Default; Database=<database-name>;"
    

    Nota

    Il tipo di autenticazione predefinito di Active Directory può essere usato sia nel computer locale che nel servizio app Azure. Il driver tenta di acquisire un token da Microsoft Entra ID usando vari mezzi. Se l'app viene distribuita, ottiene un token dall'identità gestita assegnata dal sistema dell'app. Può anche eseguire l'autenticazione con un'identità gestita assegnata dall'utente se si include: User Id=<client-id-of-user-assigned-managed-identity>; nel stringa di connessione. Se l'app è in esecuzione in locale, prova a ottenere un token da Visual Studio, Visual Studio Code e dall'interfaccia della riga di comando di Azure.

    Questo è tutto ciò che è necessario per connettersi a database SQL. Quando si esegue il debug in Visual Studio, il codice usa l'utente di Microsoft Entra configurato in 2. Configurare l'ambiente di sviluppo. Il database SQL verrà configurato in un secondo momento per consentire la connessione dall'identità gestita dell'app del servizio app. La DefaultAzureCredential classe memorizza nella cache il token in memoria e lo recupera dall'ID Microsoft Entra appena prima della scadenza. Per aggiornare il token, non è necessario specificare codice personalizzato.

  3. Digitare Ctrl+F5 per eseguire di nuovo l'app. La stessa app CRUD nel browser si connette direttamente al database SQL di Azure usando l'autenticazione Microsoft Entra. Questa configurazione consente di eseguire migrazioni del database da Visual Studio.

4. Usare la connettività dell'identità gestita

Configurare quindi l'app del servizio app per la connessione al database SQL con un'identità gestita assegnata dal sistema.

Nota

In questa sezione vengono riportate le istruzioni per l'uso di un'identità assegnata dal sistema, ma è anche possibile usare un'identità assegnata dall'utente. A tale scopo, è necessario modificare il comando az webapp identity assign command per assegnare l'identità assegnata dall'utente desiderata. Quindi, quando si crea l'utente SQL, assicurarsi di usare il nome della risorsa identità assegnata dall'utente anziché il nome del sito.

Abilitare l'identità gestita nell'app

Per abilitare un'identità gestita per l'app Azure, usare il comando az webapp identity assign in Cloud Shell. Nel comando seguente sostituire app-name>.<

az webapp identity assign --resource-group myResourceGroup --name <app-name>

Nota

Per abilitare l'identità gestita per uno slot di distribuzione, aggiungere --slot <slot-name> e usare il nome dello slot nel <nome> dello slot.

Ecco un esempio di output:

{
  "additionalProperties": {},
  "principalId": "21dfa71c-9e6f-4d17-9e90-1d28801c9735",
  "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47",
  "type": "SystemAssigned"
}

Concedere le autorizzazioni a un'identità gestita

Nota

Se si vuole, è possibile aggiungere l'identità a un gruppo Microsoft Entra, quindi concedere database SQL l'accesso al gruppo Microsoft Entra anziché 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 myResourceGroup --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
  1. In Cloud Shell accedere al database SQL con il comando SQLCMD. Sostituire <server-name> con il nome del server, <db-name> con il nome del database usato dall'app e <aad-user-name> e <aad-password> con le credenziali dell'utente di Microsoft Entra.

    sqlcmd -S <server-name>.database.windows.net -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30
    
  2. Nel prompt SQL del database desiderato eseguire i comandi seguenti per concedere le autorizzazioni minime necessarie per l'app. ad esempio:

    CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
    ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
    ALTER ROLE db_ddladmin ADD MEMBER [<identity-name>];
    GO
    

    <identity-name> è il nome dell'identità gestita in Microsoft Entra ID. Se l'identità è assegnata dal sistema, il nome corrisponde sempre al nome dell'app servizio app. Per uno slot di distribuzione, il nome dell'identità assegnata dal sistema è< app-name>/slots/<slot-name>. Per concedere le autorizzazioni per un gruppo Microsoft Entra, usare invece il nome visualizzato del gruppo, ad esempio myAzureSQLDBAccessGroup.

  3. Digitare EXIT per tornare al prompt di Cloud Shell.

    Nota

    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 commette un errore durante la configurazione delle autorizzazioni per il database SQL e si tenta di modificare le autorizzazioni 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.

    Nota

    L'ID Microsoft Entra e le identità gestite non sono supportate per SQL Server locale.

Modificare la stringa di connessione

Tenere presente che le stesse modifiche apportate in Web.config o appsettings.json funzionano con l'identità gestita, quindi è sufficiente rimuovere la stringa di connessione esistente nel servizio app che è stata creata da Visual Studio quando l'app è stata distribuita per la prima volta. Usare il comando seguente, ma sostituire <app-name> con il nome dell'app.

az webapp config connection-string delete --resource-group myResourceGroup --name <app-name> --setting-names MyDbConnection

5. Pubblicare le modifiche

A questo punto è sufficiente pubblicare le modifiche in Azure.

  1. Se è stata creata un'esercitazione: Creare un'app ASP.NET in Azure con database SQL, pubblicare le modifiche in Visual Studio. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto DotNetAppSqlDb e selezionare Pubblica.

    Pubblicare da Esplora soluzioni

  2. Nella pagina di pubblicazione selezionare Pubblica.

    Importante

    Assicurarsi che il nome del servizio app non corrisponda ad alcuna registrazione app esistente. Ciò causerà conflitti di ID entità.

Quando nella nuova pagina Web viene visualizzato l'elenco attività, l'app si connette al database con l'identità gestita.

App Azure dopo la migrazione Code First

Dovrebbe ora essere possibile modificare l'elenco attività come prima.

Pulire le risorse

Nei passaggi precedenti sono state create risorse di Azure in un gruppo di risorse. Se si ritiene che queste risorse non saranno necessarie in futuro, eliminare il gruppo di risorse eseguendo questo comando in Cloud Shell:

az group delete --name myResourceGroup

L'esecuzione del comando può richiedere un minuto.

Passaggi successivi

Contenuto dell'esercitazione:

  • Abilitare le identità gestite
  • Concedere all'identità gestita l'accesso al database SQL
  • Configurare Entity Framework per l'uso dell'autenticazione di Microsoft Entra con database SQL
  • Connessione a database SQL da Visual Studio usando l'autenticazione Di Microsoft Entra