Självstudie: Använda en hanterad identitet för att ansluta Key Vault till en Azure-webbapp i .NET

Med Azure Key Vault kan du lagra autentiseringsuppgifter och andra hemligheter med ökad säkerhet. Men koden måste autentisera till Key Vault för att hämta dem. Hanterade identiteter för Azure-resurser hjälper till att lösa det här problemet genom att ge Azure-tjänster en automatiskt hanterad identitet i Microsoft Entra-ID. Du kan använda den här identiteten för att autentisera till alla tjänster som stöder Microsoft Entra-autentisering, inklusive Key Vault, utan att behöva visa autentiseringsuppgifter i koden.

I den här självstudien skapar och distribuerar du Azure-webbprogram till Azure App Service. Du använder en hanterad identitet för att autentisera din Azure-webbapp med ett Azure-nyckelvalv med hjälp av Azure Key Vault-hemligt klientbibliotek för .NET och Azure CLI. Samma grundläggande principer gäller när du använder det utvecklingsspråk du väljer, Azure PowerShell och/eller Azure-portalen.

Mer information om webbprogram och distribution i Azure App Service som visas i den här självstudien finns i:

Förutsättningar

För att slutföra självstudierna behöver du:

Om du redan har din webbapp distribuerad i Azure App Service kan du hoppa över för att konfigurera webbappens åtkomst till ett nyckelvalv och ändra kodavsnitt för webbprogram .

Skapa en .NET Core-app

I det här steget konfigurerar du det lokala .NET Core-projektet.

I ett terminalfönster på datorn skapar du en katalog med namnet akvwebapp och gör den till den aktuella katalogen:

mkdir akvwebapp
cd akvwebapp

Skapa en .NET Core-app med hjälp av det nya webbkommandot dotnet:

dotnet new web

Kör programmet lokalt så att du vet hur det ska se ut när du distribuerar det till Azure:

dotnet run

I en webbläsare går du till appen på http://localhost:5000.

Meddelandet "Hello World!" visas från exempelappen som visas på sidan.

Mer information om hur du skapar webbprogram för Azure finns i Skapa en ASP.NET Core-webbapp i Azure App Service

distribuera appen till Azure

I det här steget distribuerar du .NET Core-programmet till Azure App Service med hjälp av lokal Git. Mer information om hur du skapar och distribuerar program finns i Skapa en ASP.NET Core-webbapp i Azure.

Konfigurera den lokala Git-distributionen

I terminalfönstret väljer du Ctrl+C för att stänga webbservern. Initiera en Git-lagringsplats för .NET Core-projektet:

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

Du kan använda FTP och lokal Git för att distribuera en Azure-webbapp med hjälp av en distributionsanvändare. När du har konfigurerat distributionsanvändaren kan du använda den för alla dina Azure-distributioner. Ditt användarnamn och lösenord för distribution på kontonivå skiljer sig från dina autentiseringsuppgifter för Azure-prenumerationen.

Om du vill konfigurera distributionsanvändaren kör du kommandot az webapp deployment user set . Välj ett användarnamn och lösenord som följer dessa riktlinjer:

  • Användarnamnet måste vara unikt inom Azure. För lokala Git-push-push-meddelanden kan den inte innehålla symbolen at sign (@).
  • Lösenordet måste vara minst åtta tecken långt och innehålla två av följande tre element: bokstäver, siffror och symboler.
az webapp deployment user set --user-name "<username>" --password "<password>"

JSON-utdata visar lösenordet som null. Om du får ett 'Conflict'. Details: 409 fel ändrar du användarnamnet. Om du ser felet 'Bad Request'. Details: 400 ska du använda ett starkare lösenord.

Registrera ditt användarnamn och lösenord så att du kan använda det för att distribuera dina webbappar.

Skapa en resursgrupp

En resursgrupp är en logisk container där du distribuerar Azure-resurser och hanterar dem. Skapa en resursgrupp som ska innehålla både ditt nyckelvalv och webbappen med kommandot az group create :

az group create --name "myResourceGroup" -l "EastUS"

Skapa en App Service-plan

Skapa en App Service-plan med hjälp av kommandot Azure CLI az appservice plan create . I följande exempel skapas en App Service-plan med namnet myAppServicePlanFREE prisnivån:

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

När App Service-planen skapas visar Azure CLI information som liknar det du ser här:

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/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
} 

Mer information finns i Hanera en App Service-plan i Azure.

Skapa en webbapp

Skapa en Azure-webbapp i myAppServicePlan App Service-planen.

Viktigt!

Precis som ett nyckelvalv måste en Azure-webbapp ha ett unikt namn. Ersätt <your-webapp-name> med namnet på webbappen i följande exempel.

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

När webbappen skapas visar Azure CLI utdata som liknar det du ser här:

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

URL:en för Git-fjärren visas i egenskapen deploymentLocalGitUrl i formatet https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git. Spara den här URL:en. Du behöver det senare.

Konfigurera nu webbappen så att den distribueras från grenen main :

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

Gå till din nya app med hjälp av följande kommando. Ersätt <your-webapp-name> med ditt appnamn.

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

Du ser standardwebbsidan för en ny Azure-webbapp.

Distribuera din lokala app

I det lokala terminalfönstret kan du lägga till en Azure-fjärrdatabas till din lokala Git-databas. I följande kommando ersätter <deploymentLocalGitUrl-from-create-step> du med URL:en för git-fjärren som du sparade i avsnittet Skapa en webbapp .

git remote add azure <deploymentLocalGitUrl-from-create-step>

Använd följande kommando för att skicka till Azure-fjärren för att distribuera din app. När Git Credential Manager frågar efter autentiseringsuppgifter använder du de autentiseringsuppgifter som du skapade i avsnittet Konfigurera den lokala Git-distributionen .

git push azure main

Det kan ta några minuter att köra det här kommandot. När den körs visas information som liknar det du ser här:

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

Gå till (eller uppdatera) det distribuerade programmet med hjälp av webbläsaren:

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

Meddelandet "Hello World!" visas som du såg tidigare när du besökte http://localhost:5000.

Mer information om hur du distribuerar webbprogram med Git finns i Lokal Git-distribution till Azure App Service

Konfigurera webbappen för att ansluta till Key Vault

I det här avsnittet konfigurerar du webbåtkomst till Key Vault och uppdaterar programkoden för att hämta en hemlighet från Key Vault.

Skapa och tilldela en hanterad identitet

I den här självstudien använder vi hanterad identitet för att autentisera till Key Vault. Hanterad identitet hanterar automatiskt programautentiseringsuppgifter.

Kör kommandot az webapp-identity assign i Azure CLI för att skapa identiteten för programmet:

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

Kommandot returnerar det här JSON-kodfragmentet:

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

Om du vill ge webbappen behörighet att utföra åtgärder för att hämta och lista i nyckelvalvet skickar principalId du kommandot till azure CLI az keyvault set-policy :

az keyvault set-policy --name "<your-keyvault-name>" --object-id "<principalId>" --secret-permissions get list

Du kan också tilldela åtkomstprinciper med hjälp av Azure-portalen eller PowerShell.

Ändra appen så att den får åtkomst till ditt nyckelvalv

I den här självstudien använder du det hemliga klientbiblioteket för Azure Key Vault i demonstrationssyfte. Du kan också använda Azure Key Vault-certifikatklientbiblioteket eller Azure Key Vault-nyckelklientbiblioteket.

Installera paketen

Från terminalfönstret installerar du azure key vault-klientbiblioteket för .NET- och Azure Identity-klientbibliotekspaket:

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

Uppdatera koden

Leta upp och öppna filen Startup.cs för .NET 5.0 eller tidigare, eller Program.cs-filen för .NET 6.0 i ditt akvwebapp-projekt.

Lägg till dessa rader i rubriken:

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

Lägg till följande rader före anropet app.UseEndpoints (.NET 5.0 eller tidigare) eller app.MapGet anropa (.NET 6.0) och uppdatera URI:n för att återspegla vaultUri nyckelvalvets. Den här koden använder DefaultAzureCredential() för att autentisera till Key Vault, som använder en token från hanterad identitet för att autentisera. Mer information om autentisering till Key Vault finns i utvecklarguiden. Koden använder också exponentiell backoff för återförsök om Key Vault begränsas. Mer information om transaktionsgränser för Key Vault finns i Vägledning för Begränsning av 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://<your-unique-key-vault-name>.vault.azure.net/"), new DefaultAzureCredential(),options);

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

string secretValue = secret.Value;
.NET 5.0 eller tidigare

Uppdatera raden await context.Response.WriteAsync("Hello World!"); så att den ser ut så här:

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

Uppdatera raden app.MapGet("/", () => "Hello World!"); så att den ser ut så här:

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

Spara ändringarna innan du fortsätter till nästa steg.

Distribuera din webbapp igen

Nu när du har uppdaterat koden kan du distribuera om den till Azure med hjälp av följande Git-kommandon:

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

Gå till din färdiga webbapp

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

Där innan du såg "Hello World!", bör du nu se värdet för din hemlighet som visas.

Nästa steg