Tutorial: Connessione al database SQL dal 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: Connettersi 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
  • Connettersi a database SQL da Visual Studio usando l'autenticazione Microsoft Entra

Nota

L'autenticazione di Microsoft Entra è diversa dall'Autenticazione integrata di Windows nell'ambiente Active Directory locale (Active Directory Domain Services). 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 riprende la procedura nel punto in cui è stata interrotta 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

Abilitare prima di tutto l'autenticazione di Microsoft Entra nel 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 di Microsoft Entra consentiti, vedere Funzionalità e limitazioni di Microsoft Entra nel 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 tramite 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 il comando az sql server ad-admin create in Cloud Shell. Nel comando seguente sostituire <server-name> con il nome del server, senza il suffisso .database.windows.net.

    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 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.

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

Le istruzioni in questa sezione riguardano un'identità assegnata dal sistema, Per usare un'identità assegnata dall'utente, vedere Esercitazione: Connettersi ai database di Azure da servizio app senza segreti usando un'identità gestita.

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": "aaaaaaaa-bbbb-cccc-1111-222222222222",
  "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
  "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
  • Connettersi a database SQL da Visual Studio usando l'autenticazione Microsoft Entra

 Proteggere con dominio personalizzato e certificato di protezione