Zelfstudie: Een beheerde identiteit gebruiken om Key Vault te verbinden met een Azure-web-app in .NET

Azure Key Vault biedt een manier om referenties en andere geheimen op te slaan met verbeterde beveiliging. Maar uw code moet worden geverifieerd bij Key Vault om deze op te halen. Beheerde identiteiten voor Azure-resources helpen dit probleem op te lossen door Azure-services een automatisch beheerde identiteit te geven in Microsoft Entra-id. U kunt deze identiteit gebruiken om te verifiëren bij elke service die ondersteuning biedt voor Microsoft Entra-verificatie, inclusief Key Vault, zonder dat u referenties in uw code hoeft weer te geven.

In deze zelfstudie maakt en implementeert u een Azure-webtoepassing in Azure App Service. U gebruikt een beheerde identiteit om de Azure-web-app te verifiëren bij een Azure-sleutelkluis, met behulp van de Azure Key Vault-clientbibliotheek voor geheimen voor .NET en Azure CLI. Dezelfde basisprincipes zijn van toepassing wanneer u de ontwikkeltaal van uw keuze, Azure PowerShell en/of Azure Portal gebruikt.

Voor meer informatie over Azure App Service-webtoepassingen en implementaties die in deze zelfstudie worden weergegeven, raadpleegt u:

Vereisten

U hebt het volgende nodig om deze zelfstudie te voltooien:

Als u uw webtoepassing al hebt geïmplementeerd in Azure App Service, kunt u dit overslaan en naar de secties over het configureren van web-app-toegang tot een sleutelkluis en het wijzigen van webtoepassingscode gaan.

Een .NET Core-app maken

In deze stap stelt u het lokale .NET Core-project in.

Maak in een terminalvenster op uw computer een map met de naam akvwebapp en maak hiervan de huidige map:

mkdir akvwebapp
cd akvwebapp

Maak een .NET Core-app met behulp van de opdracht dotnet new web:

dotnet new web

Voer de toepassing lokaal uit zodat u weet hoe deze eruit ziet wanneer u de toepassing implementeert naar Azure:

dotnet run

Ga in een webbrowser naar de app in http://localhost:5000.

U ziet het bericht 'Hallo wereld!' van de voorbeeld-app die op de pagina wordt weergegeven.

Raadpleeg Een ASP.NET Core-web-app maken in Azure App Service voor meer informatie over het maken van webtoepassingen voor Azure

De app implementeren in Azure

In deze stap implementeert u de .NET Core-app met Azure App Service met behulp van lokale Git. Zie Een ASP.NET Core-web-app maken in Azure voor meer informatie over het maken en implementeren van toepassingen.

De lokale Git-implementatie configureren

Selecteer in het terminalvenster CTRL + C om de webserver te sluiten. Initialiseer een Git-opslagplaats voor het .NET Core-project:

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

U kunt FTP en lokale Git gebruiken om een Azure-web-app te implementeren met behulp van een implementatiegebruiker. Nadat u deze implementatiegebruiker hebt gemaakt, kunt u deze voor al uw Azure-implementaties gebruiken. Uw gebruikersnaam en wachtwoord voor implementatie op accountniveau verschillen van de referenties voor uw Azure-abonnement.

Als u de implementatiegebruiker wilt configureren, voert u de opdracht az webapp deployment user set uit. Kies een gebruikersnaam en wachtwoord die voldoen aan de volgende richtlijnen:

  • De gebruikersnaam moet binnen Azure uniek zijn. Voor lokale Git-pushes mag deze geen apenstaartje (@) bevatten.
  • Het wachtwoord moet ten minste acht tekens lang zijn en minimaal twee van de volgende drie typen elementen bevatten: letters, cijfers en symbolen.
az webapp deployment user set --user-name "<username>" --password "<password>"

De JSON-uitvoer toont het wachtwoord als null. Als er een 'Conflict'. Details: 409-fout optreedt, wijzigt u de gebruikersnaam. Als er een 'Bad Request'. Details: 400-fout optreedt, kiest u een sterker wachtwoord.

Noteer uw gebruikersnaam en wachtwoord zodat u deze kunt gebruiken bij het implementeren van uw web-apps.

Een brongroep maken

Een resourcegroep is een logische container waarin u uw Azure-resources implementeert en beheert. Maak een resourcegroep om zowel uw sleutelkluis als uw web-app in te bewaren met behulp van de opdracht az group create:

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

Een App Service-plan maken

Maak een App Service-plan met behulp van de Azure CLI-opdracht az appservice plan create. In dit volgende voorbeeld wordt een App Service-plan gemaakt met de naam myAppServicePlan in de FREE prijscategorie:

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

Wanneer het App Service-plan wordt gemaakt, toont de Azure CLI informatie die lijkt op wat u hier ziet:

{ 
  "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
} 

Zie Een App Service-plan beheren in Azure voor meer informatie.

Een webtoepassing maken

Maak een Azure-web-app in het App Service-plan myAppServicePlan.

Belangrijk

Net als een sleutelkluis moet een Azure-web-app een unieke naam hebben. Vervang in de volgende voorbeelden <your-webapp-name> door de naam van uw web-app.

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

Wanneer de web-app is gemaakt, toont de Azure CLI soortgelijke uitvoer als wat u hier ziet:

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

De URL van de externe Git wordt weergegeven in de eigenschap deploymentLocalGitUrl, in de indeling https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git. Sla deze URL op. U hebt deze later nodig.

Configureer nu uw web-app om te implementeren vanuit de main vertakking:

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

Ga naar uw nieuwe app met behulp van de volgende opdracht. Vervang <your-webapp-name> door de naam van uw app.

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

De standaardwebpagina voor een nieuwe Azure-web-app wordt weergeven.

Uw lokale app implementeren

Voeg, eenmaal terug in het lokale terminalvenster, een externe Azure-instantie toe aan uw lokale Git-opslagplaats. Vervang in de volgende opdracht <deploymentLocalGitUrl-from-create-step> door de URL van de externe Git die u hebt opgeslagen in de sectie Een webtoepassing maken.

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

Push naar de externe Azure-instantie om uw app te implementeren met behulp van de volgende opdracht. Wanneer Git Credential Manager u om referenties vraagt, gebruikt u de referenties die u hebt gemaakt in de sectie De lokale Git-implementatie configureren.

git push azure main

Het uitvoeren van deze opdracht kan enkele minuten duren. Terwijl deze wordt uitgevoerd, wordt er informatie weergegeven die vergelijkbaar is met wat u hier ziet:

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

Ga naar (of vernieuw) de geïmplementeerde toepassing via uw webbrowser:

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

U ziet het bericht 'Hallo wereld!' dat u eerder hebt gezien toen u bezochthttp://localhost:5000.

Raadpleeg Lokale Git-implementatie in Azure App Service voor meer informatie over het implementeren van webtoepassingen met behulp van Git

De web-app configureren om verbinding te maken met Key Vault

In deze sectie configureert u de webtoegang tot de sleutelkluis en werkt u uw toepassingscode bij om een geheim uit de sleutelkluis op te halen.

Een beheerde identiteit maken en toewijzen

In deze zelfstudie gebruiken we een beheerde identiteit voor het verifiëren van Key Vault. Met een beheerde identiteit worden toepassingsreferenties automatisch beheerd.

Voer in Azure CLI de opdracht az webapp-identity assign uit om de identiteit voor de toepassing te maken:

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

Met deze opdracht wordt dit JSON-fragment geretourneerd:

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

Als u uw web-app toestemming wilt geven om bewerkingen voor ophalen en weergeven uit te voeren op uw sleutelkluis, geeft u de principalId door aan de Azure CLI-opdracht az keyvault set-policy:

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

U kunt ook een toegangsbeleid toewijzen met behulp van Azure Portal of PowerShell.

De app wijzigen om toegang te krijgen tot uw sleutelkluis

In deze zelfstudie gebruikt u de Azure Key Vault-clientbibliotheek voor geheimen voor demonstratiedoeleinden. U kunt ook de Azure Key Vault-clientbibliotheek voor certificaten of de Azure Key Vault-bibliotheek voor sleutels gebruiken.

De pakketten installeren

Installeer vanuit het terminalvenster de pakketten voor de Azure Key Vault-clientbibliotheek voor geheimen en de Azure Identity-clientbibliotheek:

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

De code bijwerken

Zoek en open het bestand Startup.cs voor .NET 5.0 of eerder of Program.cs voor .NET 6.0 in uw akvwebapp-project.

Voeg deze regels toe aan de koptekst:

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

Voeg de volgende regels toe vóór de app.UseEndpoints aanroep (.NET 5.0 of eerder) of app.MapGet aanroep (.NET 6.0), waarbij de URI wordt bijgewerkt zodat deze overeenkomt met de vaultUri sleutelkluis. Deze code maakt gebruik van DefaultAzureCredential () om te verifiëren bij Key Vault, waarbij een token van de beheerde identiteit wordt gebruikt voor verificatie. Zie de Gids voor ontwikkelaars voor meer informatie over het verifiëren bij Key Vault. De code gebruikt ook exponentieel uitstel voor nieuwe pogingen wanneer Key Vault wordt vertraagd. Zie Azure Key Vault-beperkingsrichtlijnen voor meer informatie over transactiebeperkingen van sleutelkluizen.

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 of eerder

Werk de regel await context.Response.WriteAsync("Hello World!"); bij zodat deze op deze regel lijkt:

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

Werk de regel app.MapGet("/", () => "Hello World!"); bij zodat deze op deze regel lijkt:

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

Zorg ervoor dat u uw wijzigingen opslaat voordat u verdergaat met de volgende stap.

Uw web-app opnieuw implementeren

Nu u uw code hebt bijgewerkt, kunt u deze opnieuw implementeren in Azure met behulp van deze Git-opdrachten:

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

Ga naar uw voltooide web-app

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

Waar eerder 'Hallo wereld' stond, zou nu de waarde van uw geheim moeten staan.

Volgende stappen