Esercitazione: Usare un'identità gestita per collegare Key Vault a un'app web di Azure in .NET

Azure Key Vault consente di archiviare le credenziali e altri segreti con maggiore sicurezza. Tuttavia, il codice deve eseguire l'autenticazione per Key Vault per recuperarli. Le identità gestite per le risorse di Azure risolve questo problema fornendo ai servizi Azure un'identità gestita automaticamente in Microsoft Entra ID. Il codice usa questa identità per eseguire l'autenticazione a qualsiasi servizio che supporti l'autenticazione Microsoft Entra, inclusa Key Vault, senza incorporare le credenziali nel codice.

In questa esercitazione viene creata e distribuita un'applicazione Web Azure in Servizio app di Azure, quindi si usa un'identità gestita per autenticare l'app in un insieme di credenziali delle chiavi usando la libreria client dei segreti Azure Key Vault per .NET e l'interfaccia della riga di comando di Azure. Gli stessi principi si applicano se si usa un'altra lingua, Azure PowerShell o il portale di Azure.

Per altre informazioni sulle app Web e sulla distribuzione del servizio app, vedere:

Prerequisiti

Per completare questa esercitazione, è necessario:

Se è già stata distribuita un'app Web in Servizio app di Azure, passare a Configurare l'app Web per connettersi a Key Vault e Modificare l'app per accedere alla key vault.

Creare un'app .NET Core

In questo passaggio configurare il progetto .NET locale.

In una finestra del terminale creare una directory denominata akvwebapp e passare a questa directory:

mkdir akvwebapp
cd akvwebapp

Creare un'app Web .NET usando il comando dotnet new web:

dotnet new web

Eseguire l'app in locale per verificare l'aspetto prima di distribuirlo in Azure:

dotnet run

In un Web browser aprire l'app all'indirizzo http://localhost:5000. Viene visualizzato il messaggio "Hello World!" dall'app di esempio.

Per altre informazioni sulla creazione di app Web, vedere Creare un'app Web ASP.NET Core in Servizio app di Azure.

Distribuire l'app in Azure

In questo passaggio distribuire l'app .NET in Servizio app di Azure usando zip deploy. Zip deploy è il meccanismo di distribuzione basato su pacchetti consigliato per App Service. Per la distribuzione continua dal controllo del codice sorgente, usa invece GitHub Actions o Azure DevOps Pipelines.

Creare un gruppo di risorse

Creare un gruppo di risorse per contenere il Key Vault e l'app Web usando az group create:

az group create --name "<resource-group>" --location "EastUS"

Creare un piano di servizio app

Creare un piano di servizio app tramite az appservice plan create. L'esempio seguente crea un piano denominato myAppServicePlan nel livello gratuito (FREE):

az appservice plan create --name myAppServicePlan --resource-group <resource-group> --sku FREE

Creare un'app Web

Creare un'app Web di Azure nel piano myAppServicePlan.

Importante

Analogamente a un insieme di credenziali delle chiavi, un'app Web di Azure deve avere un nome globalmente univoco. Sostituire <webapp-name> con il nome dell'app Web.

az webapp create --resource-group "<resource-group>" --plan "myAppServicePlan" --name "<webapp-name>"

Vai alla nuova app per confermare che sia in esecuzione:

https://<webapp-name>.azurewebsites.net

Viene visualizzata la pagina predefinita per una nuova app Web Azure.

Distribuire l'app locale con zip deploy

Dalla directory del akvwebapp progetto compilare il progetto e creare un file ZIP di distribuzione:

dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..

Suggerimento

In Windows senza zipusare PowerShell: Compress-Archive -Path .\publish\* -DestinationPath .\akvwebapp.zip.

Distribuire il file ZIP nell'app Web usando az webapp deploy:

az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip

Aggiornare l'app distribuita nel Web browser:

https://<webapp-name>.azurewebsites.net

Viene visualizzato lo stesso messaggio "Hello World!" visualizzato in http://localhost:5000.

Configurare l'app Web per la connessione a Key Vault

In questa sezione, abiliti l'app Web ad accedere a Key Vault e aggiorni il codice dell'app per recuperare un segreto.

Creare e assegnare l'accesso a un'identità gestita

Usare un'identità gestita per autenticare l'app Web per Key Vault. Un'identità gestita rimuove la necessità di gestire le credenziali nel codice.

Creare l'identità per l'app usando az webapp identity assign:

az webapp identity assign --name "<webapp-name>" --resource-group "<resource-group>"

Il comando restituisce un frammento JSON simile al seguente:

{
  "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "type": "SystemAssigned"
}

Per ottenere le autorizzazioni per l'insieme di credenziali delle chiavi tramite il controllo degli accessi in base al ruolo (RBAC), assegnare un ruolo all'UPN (User Principal Name) usando il comando dell'interfaccia della riga di comando di Azure az role assignment create.

az role assignment create --role "Key Vault Secrets User" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.KeyVault/vaults/<vault-name>"

Sostituire <upn>, <subscription-id>e <vault-name> con i valori effettivi. Se è stato usato un nome di gruppo di risorse diverso, sostituire anche "myResourceGroup". L'UPN in genere sarà nel formato di un indirizzo e-mail (ad esempio, username@domain.com).

Modificare l'app per l'accesso all'insieme di credenziali delle chiavi

Questa esercitazione utilizza la libreria client dei segreti di Azure Key Vault. È anche possibile usare la libreria client dei certificati Azure Key Vault o la libreria client delle chiavi Azure Key Vault.

Installare i pacchetti

Dalla finestra del terminale, installare la libreria client Secret di Azure Key Vault e la libreria client Azure Identity:

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Secrets

Aggiornare il codice

Apri Program.cs nel tuo progetto akvwebapp.

Aggiungere queste using direttive all'inizio del file:

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;

Aggiungere le righe seguenti prima della chiamata a app.MapGet, sostituendo <vault-name> con il nome dell'insieme di credenziali delle chiavi. Questo codice usa DefaultAzureCredential per eseguire l'autenticazione per Key Vault tramite l'identità gestita dell'app Web. Per altre informazioni, vedere la guida per gli sviluppatori. Il codice configura anche il backoff esponenziale per la ripetizione dei tentativi in caso di limitazione di Key Vault. Per dettagli sui limiti di transazione, consulta le linee guida sulla limitazione delle richieste di Azure Key Vault.

SecretClientOptions options = new SecretClientOptions()
    {
        Retry =
        {
            Delay= TimeSpan.FromSeconds(2),
            MaxDelay = TimeSpan.FromSeconds(16),
            MaxRetries = 5,
            Mode = RetryMode.Exponential
         }
    };
var client = new SecretClient(new Uri("https://<vault-name>.vault.azure.net/"), new DefaultAzureCredential(), options);

KeyVaultSecret secret = client.GetSecret("<secret-name>");

string secretValue = secret.Value;

Aggiornare la riga app.MapGet("/", () => "Hello World!"); in:

app.MapGet("/", () => secretValue);

Salvare le modifiche.

Ridistribuire l'app Web

Ricompilare il pacchetto di distribuzione e ridistribuire:

dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..
az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip

Passare all'app Web completata

https://<webapp-name>.azurewebsites.net

Dove prima veniva visualizzato "Hello World!", ora viene visualizzato il valore del segreto.

Passaggi successivi