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:
- Översikt över App Service
- Skapa en ASP.NET Core-webbapp i Azure App Service
- Lokal Git-distribution till Azure App Service
Förutsättningar
För att slutföra självstudierna behöver du:
- En Azure-prenumeration Skapa en kostnadsfritt.
- .NET Core 3.1 SDK (eller senare).
- En Git-installation av version 2.28.0 eller senare.
- Azure CLI eller Azure PowerShell.
- Azure Key Vault. Du kan skapa ett nyckelvalv med hjälp av Azure-portalen, Azure CLI eller Azure PowerShell.
- En Key Vault-hemlighet. Du kan skapa en hemlighet med hjälp av Azure-portalen, PowerShell eller Azure CLI.
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 myAppServicePlan
på FREE
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 åtkomst till 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 ditt program behörigheter till ditt nyckelvalv via rollbaserad åtkomstkontroll (RBAC) tilldelar du en roll med hjälp av Azure CLI-kommandot az role assignment create.
az role assignment create --role "Key Vault Secrets User" --assignee "<app-id>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"
Ersätt <app-id>
, <subscription-id>
och <resource-group-name>
<your-unique-keyvault-name>
med dina faktiska värden. <app-id>
är program-ID:t (klient) för ditt registrerade program i Microsoft Entra.
Ä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 fil 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.