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 verhoogde beveiliging. Maar uw code moet worden geverifieerd bij Key Vault om ze op te halen. Beheerde identiteiten voor Azure resources helpen dit probleem op te lossen door Azure services een automatisch beheerde identiteit in Microsoft Entra ID te geven. 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 Azure webtoepassing in Azure App Service. U gebruikt een beheerde identiteit om uw Azure web-app te verifiëren met een Azure key vault met behulp van Azure Key Vault geheime clientbibliotheek voor .NET en de Azure CLI. Dezelfde basisprincipes gelden wanneer u de ontwikkeltaal van uw keuze, Azure PowerShell en/of de Azure-portal gebruikt.

Zie voor meer informatie over Azure-app servicewebtoepassingen en -implementatie in deze zelfstudie:

Vereiste voorwaarden

U hebt het volgende nodig om deze zelfstudie te voltooien:

Als uw webtoepassing al in Azure App Service is geïmplementeerd, kunt u doorgaan naar configuratie van web-app-toegang tot een sleutelkluis en modificeren van webtoepassingscode secties.

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 moet zien wanneer u deze implementeert in Azure:

dotnet run

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

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

Zie Een ASP.NET Core-web-app maken in Azure App Service

De app implementeren in Azure

In deze stap implementeert u uw .NET Core-toepassing in Azure App Service met behulp van lokale Git. Zie Maak een ASP.NET Core-web-app 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 deploymentgebruiker. Nadat u de implementatiegebruiker hebt geconfigureerd, kunt u deze gebruiken voor al uw Azure implementaties. De gebruikersnaam en het wachtwoord voor de implementatie op accountniveau verschillen van uw Azure abonnementsreferenties.

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 uniek zijn binnen Azure. 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 u een 'Bad Request'. Details: 400 fout krijgt, gebruik dan 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 Azure resources implementeert en deze 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 "<resource-group>" -l "EastUS"

Een App Service-plan maken

Maak een App Service-plan met behulp van de opdracht Azure CLI 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 <resource-group> --sku FREE

Wanneer het App Service-plan wordt gemaakt, wordt in het Azure CLI informatie weergegeven die vergelijkbaar is met wat u hier ziet:

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

Zie Beheer van een App Service-plan in Azure voor meer informatie.

Een web-app maken

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

Belangrijk

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

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

Wanneer de web-app wordt gemaakt, wordt in de Azure CLI uitvoer weergegeven die vergelijkbaar is met 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>@<webapp-name>.scm.azurewebsites.net/<webapp-name>.git. Sla deze URL op. U hebt het later nodig.

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

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

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

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

U ziet de standaardwebpagina voor een nieuwe Azure-web-app.

Uw lokale app implementeren

Voeg in het lokale terminalvenster een Azure remote toe aan uw lokale Git-opslagplaats. Vervang in de volgende opdracht <deployment-url> door de URL van de externe Git die u hebt opgeslagen in de sectie Een webtoepassing maken.

git remote add azure <deployment-url>

Gebruik de volgende opdracht om naar de externe Azure te pushen om uw app te implementeren. 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 kan enkele minuten duren voordat deze opdracht is uitgevoerd. 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://<webapp-name>.azurewebsites.net

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

Zie Local Git-implementatie voor Azure App Service

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

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

Toegang tot een beheerde identiteit maken en toewijzen

In deze zelfstudie gebruiken we beheerde identiteit om te verifiëren bij Key Vault. Met een beheerde identiteit worden toepassingsreferenties automatisch beheerd.

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

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

Met deze opdracht wordt dit JSON-fragment geretourneerd:

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

Als u machtigingen wilt verkrijgen voor uw sleutelkluis via Role-Based Access Control (RBAC), wijst u een rol toe aan uw UPN (User Principal Name) met behulp van de Azure CLI-opdracht az-roltoewijzing maken.

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

Vervang , <upn>en <subscription-id> door <vault-name>uw werkelijke waarden. Als u een andere resourcegroepnaam hebt gebruikt, vervangt u myResourceGroup ook. Uw UPN heeft meestal de indeling van een e-mailadres (bijvoorbeeld username@domain.com).

Pas de app aan om toegang te krijgen tot uw sleutelkluis

In deze zelfstudie gebruikt u Azure Key Vault geheime clientbibliotheek voor demonstratiedoeleinden. U kunt ook Azure Key Vault clientbibliotheek voor certificaten of Azure Key Vault sleutelclientbibliotheek gebruiken.

De pakketten installeren

Installeer vanuit het terminalvenster de Azure Key Vault geheime clientbibliotheek voor .NET en Azure Identity-clientbibliotheekpakketten:

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

De code bijwerken

Zoek en open het Startup.cs-bestand 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 aanroep app.UseEndpoints (.NET 5.0 of lager) of app.MapGet-aanroep (.NET 6.0), waarbij de URI wordt bijgewerkt met de vaultUri van uw sleutelkluis. Deze code maakt gebruik van DefaultAzureCredential() voor verificatie bij Key Vault, waarbij een token van beheerde identiteit wordt gebruikt om te verifiëren. Zie de Ontwikkelaarsgids voor meer informatie over authenticatie met Key Vault. De code maakt ook gebruik van exponentieel uitstel voor nieuwe pogingen voor het geval Key Vault wordt beperkt. Zie voor meer informatie over Key Vault-transactielimieten de Azure Key Vault throttlingrichtlijnen.

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

Werk de regel await context.Response.WriteAsync("Hallo wereld!"); bij om er als volgt uit te zien:

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

Werk de regel app.MapGet("/", () => "Hallo wereld!"); bij om er als volgt uit te zien:

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

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

Uw web-app opnieuw implementeren

Nu u de code hebt bijgewerkt, kunt u deze opnieuw implementeren naar 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://<webapp-name>.azurewebsites.net

Nu u eerder "Hallo wereld!" zag, moet u nu de waarde van uw geheim zien weergegeven.

Volgende stappen