Condividi tramite


Esercitazione: Connettere un'app del Servizio app al database SQL per conto dell'utente connesso

Questa esercitazione illustra come connettere un'app del servizio app di Azure a un database SQL di Azure back-end rappresentando l'utente connesso, detto anche flusso on-behalf-of. Per configurare questo flusso, abilitare l'autenticazione predefinita del servizio app usando il provider di identità Microsoft Entra.

Questo metodo di connettività è più avanzato rispetto all'approccio basato sull'identità gestita in Esercitazione: Accedere ai dati con identità gestita e presenta i vantaggi seguenti negli scenari aziendali:

  • Elimina i segreti di connessione ai servizi back-end, così come l'approccio basato sull'identità gestita.
  • Fornisce al database back-end o ad altri servizi di Azure un maggiore controllo sulla quantità di accesso da concedere a chi.
  • Consente all'app di adattare la presentazione dei dati all'utente connesso.

In questa esercitazione si aggiunge l'autenticazione Di Microsoft Entra a un'app Web .NET con un back-end del database SQL di Azure. Scopri come:

  • Abilitare l'autenticazione di Microsoft Entra per il database SQL di Azure.
  • Disabilitare altre opzioni di autenticazione del database SQL.
  • Aggiungere l'ID Microsoft Entra come provider di identità per l'app.
  • Configurare l'autorizzazione di rappresentazione utente del database SQL.
  • Configurare il servizio app per fornire un token di accesso utilizzabile per il database SQL.
  • Accedere al database SQL di Azure per conto dell'utente connesso a Microsoft Entra.

Al termine dell'esercitazione, l'app si connette in modo sicuro al database SQL per conto dell'utente connesso.

Diagramma dell'architettura per lo scenario di esercitazione.

Nota

Prerequisiti

1. Configurare il server di database con l'autenticazione di Microsoft Entra

Abilitare l'autenticazione di Microsoft Entra nel database SQL di Azure assegnando un utente Microsoft Entra come amministratore del server SQL di Azure. L'amministratore di Microsoft Entra deve essere un utente che viene creato, importato, sincronizzato o invitato in Microsoft Entra ID. L'utente di Microsoft Entra potrebbe non corrispondere all'utente dell'account Microsoft per la sottoscrizione di Azure.

Per aggiungere l'utente microsoft Entra ID come amministratore del server SQL di Azure, eseguire i comandi seguenti dell'interfaccia della riga di comando di Azure.

  1. Usare az ad user list con il display-nameparametro , filtero upn per ottenere l'ID oggetto per l'utente di Microsoft Entra ID che si vuole rendere amministratore. Ad esempio, il comando seguente elenca le informazioni per un utente di Microsoft Entra ID con nome display-name cognome.

    az ad user list --display-name "Firstname Lastname"
    

    Copiare il id valore dall'output da usare nel passaggio successivo.

    Suggerimento

    È possibile eseguire az ad user list autonomo per visualizzare informazioni per tutti gli utenti nella directory Microsoft Entra.

  2. Aggiungere l'utente microsoft Entra ID come amministratore nel server SQL di Azure usando az sql server ad-admin create con il object-id parametro . Nel comando seguente sostituire <group-name> con il nome del gruppo di risorse del server, <server-name> con il nome del server meno il .database.windows.net suffisso e <entra-id> con l'output id del comando precedente az ad user list .

    az sql server ad-admin create --resource-group <group-name> --server-name <server-name> --display-name ADMIN --object-id <entra-id>
    
  3. Limitare l'autenticazione del server di database solo all'autenticazione Microsoft Entra. Questo passaggio disabilita l'autenticazione con nome utente e password SQL.

    az sql server ad-only-auth enable --resource-group <group-name> --name <server-name>
    

2. Abilitare l'autenticazione di Microsoft Entra ID per l'app

Aggiungere l'ID Microsoft Entra come provider di identità per l'app. Per altre informazioni, vedere Configurare l'autenticazione di Microsoft Entra per un'applicazione dei servizi app.

  1. Nella pagina del portale di Azure per l'app selezionare Autenticazione in Impostazioni nel menu di spostamento a sinistra.

  2. Nella pagina Autenticazione selezionare Aggiungi provider di identità o selezionare Aggiungi provider nella sezione Provider di identità .

  3. Nella pagina Aggiungi provider di identità selezionare Microsoft come provider.

  4. Per Scadenza segreto client selezionare una delle opzioni dell'elenco a discesa, ad esempio Consigliato: 180 giorni.

  5. Mantenere tutte le impostazioni predefinite e selezionare Aggiungi.

    Screenshot che mostra la pagina Aggiungi un provider di identità.

Nota

Se si riconfigurano le impostazioni di autenticazione dell'app, i token nell'archivio token potrebbero non rigenerarsi dalle nuove impostazioni. Per assicurarsi che i token vengano rigenerati, disconnettersi e accedere di nuovo all'app. Un metodo semplice consiste nell'usare il browser in modalità privata. Chiudere e riaprire il browser in modalità privata dopo aver modificato le impostazioni nelle app.

3. Configurare la rappresentazione dell'utente del database SQL

Concedere all'app le autorizzazioni per accedere al database SQL per conto dell'utente connesso a Microsoft Entra.

  1. Nella pagina Autenticazione dell'app selezionare il nome dell'app in Provider di identità.

    Verrà visualizzata la pagina di registrazione dell'app. Questa registrazione è stata generata automaticamente quando è stato aggiunto il provider Microsoft Entra.

  2. Selezionare Autorizzazioni API in Gestisci nel menu di spostamento a sinistra.

  3. Nella pagina Autorizzazioni API selezionare Aggiungi un'autorizzazione.

  4. Nella schermata Richiedi autorizzazioni API selezionare la scheda API usate dall'organizzazione .

  5. Immettere il database SQL di Azure nella casella di ricerca e selezionare il risultato.

  6. In Tipo di autorizzazioni necessarie per l'applicazione selezionare Autorizzazioni delegate, quindi selezionare la casella di controllo accanto a user_impersonation e quindi selezionare Aggiungi autorizzazioni.

    Screenshot della pagina Richiedi autorizzazioni API che mostra autorizzazioni delegate, user_impersonation e il pulsante Aggiungi autorizzazione selezionato.

La registrazione dell'app in Microsoft Entra dispone ora delle autorizzazioni necessarie per connettersi al database SQL rappresentando l'utente connesso.

4. Configurare il servizio app per la restituzione di un token di accesso utilizzabile

Per configurare l'app in modo da fornire un token di accesso utilizzabile per il database SQL, aggiungere https://database.windows.net/user_impersonation come a scope al provider loginParametersMicrosoft Entra dell'app. Il comando seguente aggiunge la loginParameters proprietà con ambiti personalizzati alle impostazioni del provider di login identità Microsoft Entra.

Degli ambiti richiesti, il servizio app richiede openidgià gli ambiti , profilee email per impostazione predefinita. L'ambito offline_access è incluso in modo da poter aggiornare i token. Per altre informazioni, vedere Ambiti openID Connect.

L'ambito https://database.windows.net/user_impersonation fa riferimento al database SQL di Azure e fornisce un token JSON Web (JWT) che specifica il database SQL come destinatario del token. Questo comando usa jq per l'elaborazione JSON, già installata in Cloud Shell.

authSettings=$(az webapp auth show --resource-group <group-name> --name <app-name>)
authSettings=$(echo "$authSettings" | jq '.properties' | jq '.identityProviders.azureActiveDirectory.login += {"loginParameters":["scope=openid profile email offline_access https://database.windows.net/user_impersonation"]}')
az webapp auth set --resource-group <group-name> --name <app-name> --body "$authSettings"

Suggerimento

Per configurare l'ambito necessario usando un'interfaccia Web anziché l'interfaccia della riga di comando di Azure, usare Configurare il provider Microsoft Entra per fornire i token di aggiornamento, aggiungendo https://database.windows.net/user_impersonation agli ambiti richiesti.

L'app è ora configurata per generare un token di accesso accettato dal database SQL.

Nota

I token di accesso scadono dopo un certo periodo di tempo. Per informazioni su come aggiornare i token di accesso senza richiedere agli utenti di ripetere l'autenticazione con l'app, vedere Aggiornare i token di autenticazione.

5. Usare il token di accesso nel codice dell'applicazione

Aggiornare il codice dell'applicazione per aggiungere il token di accesso fornito dall'autenticazione del servizio app all'oggetto connessione.

Nota

Questo codice non funziona in locale. Per altre informazioni e alternative per il debug locale, vedere Eseguire il debug in locale quando si usa l'autenticazione del servizio app.

  1. DbContext Nell'oggetto in DatabaseContext.cs o in un altro file che configura il contesto del database, modificare il costruttore predefinito per aggiungere il token di accesso DELL'ID Entra Microsoft all'oggetto connessione.

    public MyDatabaseContext (DbContextOptions<MyDatabaseContext> options, IHttpContextAccessor accessor)
        : base(options)
    {
        var conn = Database.GetDbConnection() as SqlConnection;
        conn.AccessToken = accessor.HttpContext.Request.Headers["X-MS-TOKEN-AAD-ACCESS-TOKEN"];
    }
    
  2. Se nel servizio app è presente una stringa di connessione denominata defaultConnection che usa l'autenticazione SQL con nome utente e password, usare il comando seguente per rimuovere i segreti di connessione. Sostituire <group-name>, <app-name>, <db-server-name>e <db-name> con i valori.

    az webapp config connection-string set --resource-group <group-name> --name <app-name> --connection-string-type SQLAzure --settings defaultConnection="server=tcp:<db-server-name>.database.windows.net;database=<db-name>;"
    

6. Pubblicare le modifiche

Se nel browser è stato usato Visual Studio Code per apportare modifiche al codice nel fork di GitHub, selezionare Controllo del codice sorgente dal menu a sinistra. Immettere un messaggio di commit come OBO connect e selezionare Commit.

Il commit attiva una distribuzione di GitHub Actions nel Servizio app. Attendere qualche minuto per il completamento della distribuzione.

È anche possibile pubblicare le modifiche in Git Bash usando i comandi seguenti:

git commit -am "configure managed identity"
git push azure main

Se il codice si trova in Visual Studio:

  1. Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e scegliere Pubblica.

    Screenshot che mostra come eseguire la pubblicazione da Esplora soluzioni in Visual Studio.

  2. Nella pagina Pubblica selezionare Pubblica.

Quando la nuova pagina dell'app mostra l'app, l'app si connette al database SQL di Azure per conto dell'utente connesso a Microsoft Entra. Dovresti essere in grado di usare e modificare la tua app come di consueto.

Screenshot che mostra l'app Web dopo la pubblicazione.

7. Pulire le risorse

Nei passaggi precedenti sono state create risorse di Azure in un gruppo di risorse. Quando queste risorse non sono più necessarie, eliminare il gruppo di risorse eseguendo il comando seguente:

az group delete --name <group-name>

L'esecuzione di questo comando potrebbe richiedere del tempo.

Domande frequenti

Perché viene visualizzato un errore "Accesso non riuscito per l'utente "<entità> identificata da token"?

Le cause più comuni di un Login failed for user '<token-identified principal>' errore sono:

Come si aggiungono altri utenti o gruppi di Microsoft Entra nel database SQL di Azure?

Per aggiungere altri utenti o gruppi, connettersi al server di database usando sqlcmd o SQL Server Management Studio (SSMS) e creare utenti di database indipendenti mappati alle identità di Microsoft Entra.

L'esempio di Transact-SQL seguente aggiunge un'identità Microsoft Entra a SQL Server e assegna all'identità alcuni ruoli del database:

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

Come si esegue il debug in locale quando si usa l'autenticazione del Servizio app?

Poiché l'autenticazione del servizio app è una funzionalità di Azure, il codice di questa esercitazione non funziona nell'ambiente locale. A differenza di un'app in esecuzione in Azure, il codice locale non trae vantaggio dal middleware di autenticazione del servizio app. Per il debug locale è possibile usare le alternative seguenti:

  • Connettersi al database SQL dall'ambiente locale con Active Directory Interactive l'autenticazione. Questo flusso di autenticazione non accede all'utente stesso, ma si connette al database back-end con l'utente connesso in modo da poter testare l'autorizzazione del database in locale.
  • Copiare manualmente il token di accesso nel codice al posto dell'intestazione della X-MS-TOKEN-AAD-ACCESS-TOKEN richiesta.
  • Se si esegue la distribuzione da Visual Studio, usare il debug remoto dell'app del Servizio app.

Cosa accade quando scadono i token di accesso?

Il token di accesso scade dopo un certo periodo di tempo. Per informazioni su come aggiornare i token di accesso senza chiedere agli utenti di autenticarsi di nuovo nell'app, vedere Refresh identity provider tokens (Aggiornare i token del provider di identità).