Condividi tramite


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. Identità gestite per le risorse di Azure aiutano a risolvere questo problema fornendo ai servizi di Azure un'identità gestita automaticamente in Microsoft Entra ID. È possibile usare questa identità per eseguire l'autenticazione a qualsiasi servizio che supporti l'autenticazione Microsoft Entra, inclusa Key Vault, senza dover visualizzare le credenziali nel codice.

In questa esercitazione creerai e distribuirai l'applicazione Web di Azure in Servizio app di Azure. Utilizzerai un'identità gestita per autenticare la tua app Web Azure con un Azure Key Vault usando la libreria client Azure Key Vault per segreti per .NET e l'interfaccia della riga di comando di Azure. Gli stessi principi di base si applicano quando si usa il linguaggio di sviluppo preferito, Azure PowerShell e/o il portale di Azure.

Per altre informazioni sulle applicazioni Web del servizio app Azure e sulla distribuzione presentate in questa esercitazione, vedere:

Prerequisiti

Per completare questa esercitazione, è necessario:

Se l'applicazione Web è già stata distribuita in Servizio app di Azure, è possibile passare a configurare l'accesso dell'app Web a un insieme di credenziali delle chiavi e modificare il codice dell'applicazione Web.

Creare un'app .NET Core

In questo passaggio si configurerà il progetto locale .NET Core.

In una finestra del terminale nel computer creare una directory denominata akvwebapp e impostarla come directory corrente:

mkdir akvwebapp
cd akvwebapp

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

dotnet new web

Eseguire l'applicazione in locale in modo da sapere come deve essere eseguita quando viene distribuita in Azure:

dotnet run

In un Web browser passare all'app all'indirizzo http://localhost:5000.

Verrà visualizzato il messaggio "Hello World!" dell'app di esempio visualizzata nella pagina.

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

Distribuire l'app in Azure

In questo passaggio si distribuirà l'applicazione .NET Core in Servizio app di Azure usando Git locale. Per altre informazioni su come creare e distribuire applicazioni, vedere Creare un'app Web ASP.NET Core in Azure.

Configurare la distribuzione con Git locale

Nella finestra del terminale premere CTRL+C per chiudere il server Web. Inizializzare un repository Git per il progetto .NET Core:

git init --initial-branch=main
git add .
git commit -m "first commit"

È possibile usare FTP e Git locale per distribuire un'app Web Azure usando un utente deployment. Dopo aver configurato l'utente di distribuzione, è possibile usarlo per tutte le distribuzioni Azure. Il nome utente e la password della distribuzione a livello di account sono diversi dalle credenziali della sottoscrizione Azure.

Per configurare l'utente della distribuzione, eseguire il comando az webapp deployment user set. Scegliere un nome utente e una password che rispettino le linee guida seguenti:

  • Il nome utente deve essere univoco all'interno di Azure. Per i push Git locali, non può contenere il simbolo @.
  • La password deve essere composta da almeno otto caratteri e contenere due dei tre elementi seguenti: lettere, numeri e simboli.
az webapp deployment user set --user-name "<username>" --password "<password>"

L'output JSON mostra la password come null. Se viene visualizzato un errore 'Conflict'. Details: 409, cambiare il nome utente. Se viene visualizzato un errore 'Bad Request'. Details: 400, usare una password più complessa.

Registrare il nome utente e la password in modo da poterle usare per distribuire le app Web.

Creare un gruppo di risorse

Un gruppo di risorse è un contenitore logico in cui distribuire Azure risorse e gestirle. Creare un gruppo di risorse per contenere sia il Key Vault che la web app usando il comando az group create:

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

Creare un piano di servizio app

Creare un piano di servizio App usando il comando interfaccia della riga di comando di Azure az appservice plan create. L'esempio seguente crea un piano di servizio app denominato myAppServicePlan nel piano tariffario FREE:

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

Quando viene creato il piano di servizio app, il interfaccia della riga di comando di Azure visualizza informazioni simili a quanto illustrato di seguito:

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/<resource-group>/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "app",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

Per altre informazioni, vedere Gestire un piano di servizio app in Azure.

Creare un'app Web

Creare un'app Web Azure nel piano di servizio app myAppServicePlan.

Importante

Analogamente a un Key Vault, un'app web di Azure deve avere un nome univoco. Negli esempi seguenti sostituire <webapp-name> con il nome dell'app Web.

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

Quando viene creata l'app Web, il interfaccia della riga di comando di Azure mostra l'output simile a quello visualizzato qui:

Local git is configured with url of 'https://<username>@<your-webapp-name>.scm.azurewebsites.net/<ayour-webapp-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "clientCertExclusionPaths": null,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<your-webapp-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

L'URL del repository Git remoto è visualizzato nella proprietà deploymentLocalGitUrl, nel formato https://<username>@<webapp-name>.scm.azurewebsites.net/<webapp-name>.git. Salvare questo URL. Sarà necessario in un secondo momento.

Configura ora l'app Web per distribuirla dal ramo main.

 az webapp config appsettings set -g MyResourceGroup --name "<webapp-name>" --settings deployment_branch=main

Passare alla nuova app usando il comando seguente. Sostituire <webapp-name> con il nome dell'app.

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

Verrà visualizzata la pagina Web predefinita per una nuova app Web Azure.

Implementare l'app locale

Nella finestra del terminale locale, aggiungere un remoto di Azure al repository Git locale. Nel comando seguente sostituire <deployment-url> con l'URL dell'istanza Git remota salvato nella sezione Creare un'app Web.

git remote add azure <deployment-url>

Usare il comando seguente per effettuare il push sul repository remoto di Azure per distribuire la tua app. Quando Git Credential Manager richiede le credenziali, usare quelle create nella sezione Configurare la distribuzione con Git locale.

git push azure main

L'esecuzione del comando può impiegare alcuni minuti. Durante l'esecuzione, il comando visualizza informazioni simili a quelle riportate di seguito:

Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 285 bytes | 95.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Deploy Async
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'd6b54472f7'.
remote: Repository path is /home/site/repository
remote: Running oryx build...
remote: Build orchestrated by Microsoft Oryx, https://github.com/Microsoft/Oryx
remote: You can report issues at https://github.com/Microsoft/Oryx/issues
remote:
remote: Oryx Version      : 0.2.20200114.13, Commit: 204922f30f8e8d41f5241b8c218425ef89106d1d, ReleaseTagName: 20200114.13
remote: Build Operation ID: |imoMY2y77/s=.40ca2a87_
remote: Repository Commit : d6b54472f7e8e9fd885ffafaa64522e74cf370e1
.
.
.
remote: Deployment successful.
remote: Deployment Logs : 'https://<your-webapp-name>.scm.azurewebsites.net/newui/jsonviewer?view_url=/api/deployments/d6b54472f7e8e9fd885ffafaa64522e74cf370e1/log'
To https://<your-webapp-name>.scm.azurewebsites.net:443/<your-webapp-name>.git
   d87e6ca..d6b5447  main -> main

Passare all'applicazione distribuita (o aggiornare la pagina) usando il Web browser:

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

Verrà visualizzato il messaggio "Hello World!" visualizzato in precedenza quando si è visitato http://localhost:5000.

Per altre informazioni sulla distribuzione di un'applicazione Web con Git, vedere Distribuzione Git locale in Servizio app di Azure

Configurare l'app Web per la connessione a Key Vault

In questa sezione si configurerà l'accesso Web per Key Vault e si aggiornerà il codice dell'applicazione per recuperare un segreto da Key Vault.

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

In questa esercitazione si userà managed identity per eseguire l'autenticazione a Key Vault. L'identità gestita gestisce automaticamente le credenziali delle applicazioni.

Nel interfaccia della riga di comando di Azure, per creare l'identità per l'applicazione, eseguire il comando az webapp-identity assign:

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

Il comando restituirà il frammento JSON seguente:

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

Per ottenere le autorizzazioni per l'archivio chiavi tramite Role-Based Controllo di accesso (RBAC), è necessario assegnare un ruolo al "User Principal Name" (UPN) usando il comando 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

A scopo dimostrativo, in questa esercitazione utilizzerai la libreria client per segreti di Azure Key Vault. È anche possibile usare Azure Key Vault libreria client dei certificati o Azure Key Vault libreria client delle chiavi.

Installare i pacchetti

Nella finestra del terminale installare la libreria client dei segreti Azure Key Vault per i pacchetti di libreria client di .NET e Azure Identity:

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

Aggiornare il codice

Trovare e aprire il file di Startup.cs per .NET 5.0 o versione precedente oppure Program.cs file per .NET 6.0 nel progetto akvwebapp.

Aggiungere queste righe all'intestazione:

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

Aggiungere le righe seguenti prima della chiamata app.UseEndpoints (.NET 5.0 o versioni precedenti) o app.MapGet (.NET 6.0), aggiornando l'URI in modo da riflettere il tuo vaultUri key vault. Questo codice usa DefaultAzureCredential() per eseguire l'autenticazione a Key Vault, che usa un token dall'identità gestita per l'autenticazione. Per altre informazioni sull'autenticazione per Key Vault, vedere la Guida Developer. Il codice utilizza anche il backoff esponenziale per i tentativi se il Key Vault viene soggetto al throttling. Per altre informazioni sui limiti delle transazioni di Key Vault, consultare la guida alla limitazione 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;
.NET 5.0 o versioni precedenti

Aggiornare la riga await context.Response.WriteAsync("Hello World!"); in modo che sia simile alla riga seguente:

await context.Response.WriteAsync(secretValue);
.NET 6.0

Aggiornare la riga app.MapGet("/", () => "Hello World!"); in modo che sia simile alla riga seguente:

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

Assicurarsi di salvare le modifiche prima di continuare con il passaggio successivo.

Ridistribuire l'app Web

Dopo aver aggiornato il codice, è possibile ridistribuirlo in Azure usando questi comandi Git:

git add .
git commit -m "Updated web app to access my key vault"
git push azure main

Passare all'app Web completata

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

Dove prima vedevi "Hello World!", adesso dovresti vedere il valore del tuo segreto visualizzato.

Passaggi successivi