Tutorial: Verwenden einer verwalteten Identität für die Verbindungsherstellung zwischen Key Vault und einer Azure-Web-App in .NETTutorial: Use a managed identity to connect Key Vault to an Azure web app in .NET

Azure Key Vault ermöglicht das Speichern von Anmeldeinformationen und anderen Geheimnissen mit erhöhter Sicherheit.Azure Key Vault provides a way to store credentials and other secrets with increased security. Für Ihren Code muss aber die Authentifizierung bei Key Vault erfolgen, damit der Abruf möglich ist.But your code needs to authenticate to Key Vault to retrieve them. Mit den verwalteten Identitäten für Azure-Ressourcen kann dieses Problem gelöst werden, indem für Azure-Dienste eine automatisch verwaltete Identität in Azure Active Directory (Azure AD) bereitgestellt wird.Managed identities for Azure resources help to solve this problem by giving Azure services an automatically managed identity in Azure Active Directory (Azure AD). Sie können diese Identität für die Authentifizierung bei jedem Dienst verwenden, der die Azure AD-Authentifizierung, einschließlich Key Vault, unterstützt. Hierfür müssen im Code keine Anmeldeinformationen angezeigt werden.You can use this identity to authenticate to any service that supports Azure AD authentication, including Key Vault, without having to display credentials in your code.

In diesem Tutorial führen Sie die Erstellung und Bereitstellung einer Azure-Webanwendung für Azure App Service durch.In this tutorial, you'll create and deploy Azure web application to Azure App Service. Sie verwenden eine verwaltete Identität zum Authentifizieren Ihrer Azure-Web-App für einen Azure-Schlüsseltresor, indem Sie die Azure Key Vault-Geheimnisclientbibliothek und die Azure CLI nutzen.You'll use a managed identity to authenticate your Azure web app with an Azure key vault using Azure Key Vault secret client library for .NET and the Azure CLI. Die gleichen grundlegenden Prinzipien gelten auch, wenn Sie eine Entwicklungssprache Ihrer Wahl, Azure PowerShell bzw. das Azure-Portal nutzen.The same basic principles apply when you use the development language of your choice, Azure PowerShell, and/or the Azure portal.

Weitere Informationen zu Azure App Service-Webanwendungen und zur Bereitstellung in diesem Tutorial finden Sie unter:For more information about Azure App service web applications and deployment presented in this tutorial, see:

VoraussetzungenPrerequisites

Für dieses Tutorial benötigen Sie Folgendes:To complete this tutorial, you need:

Falls Sie Ihre Webanwendung bereits in Azure App Service bereitgestellt haben, können Sie zu den Abschnitten springen, in denen das Konfigurieren des Web-App-Zugriffs auf einen Schlüsseltresor und das Ändern des Webanwendungscodes beschrieben wird.If you already have your web application deployed in Azure App Service, you can skip to configure web app access to a key vault and modify web application code sections.

Erstellen einer .NET Core-AppCreate a .NET Core app

In diesem Schritt richten Sie das lokale .NET Core-Projekt ein.In this step, you'll set up the local .NET Core project.

Erstellen Sie in einem Terminalfenster auf Ihrem Computer ein Verzeichnis mit dem Namen akvwebapp, und wechseln Sie in dieses Verzeichnis:In a terminal window on your machine, create a directory named akvwebapp and make it the current directory:

mkdir akvwebapp
cd akvwebapp

Erstellen Sie eine .NET Core-App, indem Sie den Befehl dotnet new web verwenden:Create a .NET Core app by using the dotnet new web command:

dotnet new web

Führen Sie die Anwendung lokal aus, damit Sie wissen, wie sie beim Bereitstellen in Azure aussehen sollte:Run the application locally so you know how it should look when you deploy it to Azure:

dotnet run

Wechseln Sie in einem Webbrowser unter http://localhost:5000 zur App.In a web browser, go to the app at http://localhost:5000.

Die Nachricht „Hello World!“You'll see the "Hello World!" aus der Beispiel-App wird auf der Seite angezeigt.message from the sample app displayed on the page.

Weitere Informationen zur Erstellung von Webanwendungen für Azure finden Sie unter Schnellstart: Erstellen von ASP.NET Core-Web-Apps in Azure.For more information about creating web applications for Azure, see Create an ASP.NET Core web app in Azure App Service

Bereitstellen der Anwendung in AzureDeploy the app to Azure

In diesem Schritt stellen Sie Ihre .NET Core-Anwendung unter Verwendung einer lokalen Git-Instanz in Azure App Service bereit.In this step, you'll deploy your .NET Core application to Azure App Service by using local Git. Weitere Informationen zum Erstellen und Bereitstellen von Anwendungen finden Sie unter Schnellstart: Erstellen von ASP.NET Core-Web-Apps in Azure.For more information on how to create and deploy applications, see Create an ASP.NET Core web app in Azure.

Konfigurieren der lokalen Git-BereitstellungConfigure the local Git deployment

Drücken Sie im Terminalfenster STRG+C, um den Webserver zu schließen.In the terminal window, select Ctrl+C to close the web server. Initialisieren Sie ein Git-Repository für das .NET Core-Projekt:Initialize a Git repository for the .NET Core project:

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

Sie können für die Bereitstellung einer Azure-Web-App FTP und eine lokale Git-Instanz mit einem Bereitstellungsbenutzer verwenden.You can use FTP and local Git to deploy an Azure web app by using a deployment user. Nach der Konfiguration des Bereitstellungsbenutzers können Sie ihn für alle Azure-Bereitstellungen verwenden.After you configure your deployment user, you can use it for all your Azure deployments. Der Benutzername und das Kennwort für die Bereitstellung auf Kontoebene unterscheiden sich von den Anmeldeinformationen für Ihr Azure-Abonnement.Your account-level deployment user name and password are different from your Azure subscription credentials.

Führen Sie zum Konfigurieren des Bereitstellungsbenutzers den Befehl az webapp deployment user set aus.To configure the deployment user, run the az webapp deployment user set command. Wählen Sie einen Benutzernamen und das zugehörige Kennwort gemäß den folgenden Richtlinien aus:Choose a user name and password that adheres to these guidelines:

  • Der Benutzername muss in Azure eindeutig sein.The user name must be unique within Azure. Bei lokalen Git-Pushvorgängen darf er kein at-Zeichen (@) enthalten.For local Git pushes, it can't contain the at sign symbol (@).
  • Das Kennwort muss mindestens acht Zeichen lang sein und zwei der folgenden drei Elemente enthalten: Buchstaben, Zahlen und Symbole.The password must be at least eight characters long and contain two of the following three elements: letters, numbers, and symbols.
az webapp deployment user set --user-name "<username>" --password "<password>"

In der JSON-Ausgabe wird das Kennwort als null angezeigt.The JSON output shows the password as null. Wenn Sie den Fehler 'Conflict'. Details: 409 erhalten, müssen Sie den Benutzernamen ändern.If you get a 'Conflict'. Details: 409 error, change the user name. Wenn Sie den Fehler 'Bad Request'. Details: 400 erhalten, müssen Sie ein sichereres Kennwort verwenden.If you get a 'Bad Request'. Details: 400 error, use a stronger password.

Notieren Sie Ihren Benutzernamen und das zugehörige Kennwort, damit Ihnen diese Angaben für die Bereitstellung Ihrer Web-Apps vorliegen.Record your user name and password so you can use it to deploy your web apps.

Erstellen einer RessourcengruppeCreate a resource group

Eine Ressourcengruppe ist ein logischer Container, in dem Sie Azure-Ressourcen bereitstellen und verwalten.A resource group is a logical container into which you deploy Azure resources and manage them. Verwenden Sie den Befehl az group create für die Erstellung einer Ressourcengruppe, die sowohl Ihren Schlüsseltresor als auch Ihre Web-App enthält:Create a resource group to contain both your key vault and your web app by using the az group create command:

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

Wie erstelle ich einen Plan?Create an App Service plan

Erstellen Sie mit dem Azure CLI-Befehl az appservice plan create einen App Service-Plan.Create an App Service plan by using the Azure CLI az appservice plan create command. Im folgenden Beispiel wird ein App Service-Plan namens myAppServicePlan im Tarif FREE erstellt:This following example creates an App Service plan named myAppServicePlan in the FREE pricing tier:

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

Wenn der App Service-Plan erstellt wird, werden von der Azure CLI Informationen der folgenden Art angezeigt:When the App Service plan is created, the Azure CLI displays information similar to what you see here:

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

Weitere Informationen finden Sie unter Verwalten eines App Service-Plans in Azure.For more information, see Manage an App Service plan in Azure.

Erstellen einer Web-AppCreate a web app

Erstellen Sie eine Azure-Web-App im App Service-Plan myAppServicePlan.Create an Azure web app in the myAppServicePlan App Service plan.

Wichtig

Eine Azure-Web-App muss genau wie ein Schlüsseltresor einen eindeutigen Namen haben.Like a key vault, an Azure web app must have a unique name. Ersetzen Sie in den folgenden Beispielen <your-webapp-name> durch den Namen Ihrer Web-App.Replace <your-webapp-name> with the name of your web app in the following examples.

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

Wenn die Web-App erstellt wird, werden von der Azure CLI in etwa die folgenden Informationen angezeigt:When the web app is created, the Azure CLI shows output similar to what you see here:

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

Die URL des Git-Remotespeicherorts wird in der deploymentLocalGitUrl-Eigenschaft im Format https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git angezeigt.The URL of the Git remote is shown in the deploymentLocalGitUrl property, in the format https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git. Speichern Sie diese URL.Save this URL. Sie benötigen die Information später.You'll need it later.

Konfigurieren Sie nun Ihre Web-App für die Bereitstellung über den main-Branch:Now configure your web app to deploy from the main branch:

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

Navigieren Sie mit dem folgenden Befehl zu Ihrer neuen App.Go to your new app by using the following command. Ersetzen Sie <your-webapp-name> durch den Namen Ihrer App.Replace <your-webapp-name> with your app name.

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

Die Standardwebseite für eine neue Azure-Web-App wird angezeigt.You'll see the default webpage for a new Azure web app.

Bereitstellen Ihrer lokalen AppDeploy your local app

Kehren Sie zum lokalen Terminalfenster zurück, und fügen Sie Ihrem lokalen Git-Repository einen Azure-Remotespeicherort hinzu.Back in the local terminal window, add an Azure remote to your local Git repository. Ersetzen Sie im folgenden Befehl <deploymentLocalGitUrl-from-create-step> durch die URL des Git-Remotespeicherorts, die Sie im Abschnitt Erstellen einer Web-App gespeichert haben.In the following command, replace <deploymentLocalGitUrl-from-create-step> with the URL of the Git remote that you saved in the Create a web app section.

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

Verwenden Sie den unten angegebenen Befehl, um zur Bereitstellung Ihrer App eine Pushübertragung zum Azure-Remotespeicherort durchzuführen.Use the following command to push to the Azure remote to deploy your app. Wenn Sie von Git Credential Manager zur Eingabe von Anmeldeinformationen aufgefordert werden, verwenden Sie die Anmeldeinformationen, die Sie im Abschnitt Konfigurieren der lokalen Git-Bereitstellung erstellt haben.When Git Credential Manager prompts you for credentials, use the credentials you created in the Configure the local Git deployment section.

git push azure main

Die Ausführung dieses Befehls kann einige Minuten dauern.This command might take a few minutes to run. Während der Ausführung werden Informationen der folgenden Art angezeigt:While it runs, it displays information similar to what you see here:

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

Navigieren Sie in Ihrem Webbrowser zur bereitgestellten Anwendung, oder aktualisieren Sie die Ansicht:Go to (or refresh) the deployed application by using your web browser:

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

Die Nachricht „Hello World!“You'll see the "Hello World!" wird angezeigt, die Sie schon vom Zugriff auf http://localhost:5000 kennen.message you saw earlier when you visited http://localhost:5000.

Weitere Informationen zur Bereitstellung einer Webanwendung per Git finden Sie unter Lokale Git-Bereitstellung in Azure App Service.For more information about deploying web application using Git, see Local Git deployment to Azure App Service

Konfigurieren der Web-App für die Verbindungsherstellung mit Key VaultConfigure the web app to connect to Key Vault

In diesem Abschnitt konfigurieren Sie den Webzugriff auf Key Vault und aktualisieren Ihren Anwendungscode, um ein Geheimnis aus Key Vault abzurufen.In this section, you'll configure web access to Key Vault and update your application code to retrieve a secret from Key Vault.

Erstellen und Zuweisen einer verwalteten IdentitätCreate and assign a managed identity

In diesem Tutorial verwenden wir eine verwaltete Identität für die Key Vault-Authentifizierung.In this tutorial, we'll use managed identity to authenticate to Key Vault. Mit der verwalteten Identität werden die Anmeldeinformationen der Anwendung automatisch verwaltet.Managed identity automatically manages application credentials.

Führen Sie über die Azure-Befehlszeilenschnittstelle den Befehl az webapp-identity assign aus, um die Identität für die Anwendung zu erstellen:In the Azure CLI, to create the identity for the application, run the az webapp-identity assign command:

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

Vom Befehl wird der folgende JSON-Codeausschnitt zurückgegeben:The command will return this JSON snippet:

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

Übergeben Sie die principalId an den Azure CLI-Befehl az keyvault set-policy, um Ihrer Web-App die Berechtigung zum Ausführen von Abruf- und Auflistungsvorgängen (get und list) für Ihren Schlüsseltresor zu ermöglichen:To give your web app permission to do get and list operations on your key vault, pass the principalId to the Azure CLI az keyvault set-policy command:

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

Sie können auch Zugriffsrichtlinien über das Azure-Portal oder per PowerShell zuweisen.You can also assign access policies by using the Azure portal or PowerShell.

Anpassen der App für den Zugriff auf Ihren SchlüsseltresorModify the app to access your key vault

In diesem Tutorial verwenden Sie zu Demonstrationszwecken die Azure Key Vault-Geheimnisclientbibliothek.In this tutorial, you'll use Azure Key Vault secret client library for demonstration purposes. Sie können auch die Azure Key Vault-Zertifikatclientbibliothek oder die Azure Key Vault-Schlüsselclientbibliothek verwenden.You can also use Azure Key Vault certificate client library, or Azure Key Vault key client library.

Installieren der PaketeInstall the packages

Installieren Sie über das Terminalfenster die Pakete für die Azure Key Vault-Geheimnisclientbibliothek für .NET und die Azure Identity-Clientbibliothek:From the terminal window, install the Azure Key Vault secret client library for .NET and Azure Identity client library packages:

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

Aktualisieren des CodesUpdate the code

Navigieren Sie im Projekt „akvwebapp“ zur Datei „Startup.cs“, und öffnen Sie sie.Find and open the Startup.cs file in your akvwebapp project.

Fügen Sie dem Header die folgenden Zeilen hinzu:Add these lines to the header:

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

Fügen Sie die folgenden Zeilen vor dem Aufruf von app.UseEndpoints hinzu, und aktualisieren Sie den URI, damit er dem Tresor-URI (vaultUri) Ihres Schlüsseltresors entspricht.Add the following lines before the app.UseEndpoints call, updating the URI to reflect the vaultUri of your key vault. In diesem Code wird DefaultAzureCredential() für die Key Vault-Authentifizierung genutzt. Hierbei wird ein Token der verwalteten Identität für Authentifizierungszwecke verwendet.This code uses DefaultAzureCredential() to authenticate to Key Vault, which uses a token from managed identity to authenticate. Weitere Informationen zur Key Vault-Authentifizierung finden Sie im Entwicklerhandbuch.For more information about authenticating to Key Vault, see the Developer's Guide. Darüber hinaus wird im Code das exponentielle Backoff für Wiederholungen verwendet, falls Key Vault gedrosselt wird.The code also uses exponential backoff for retries in case Key Vault is being throttled. Weitere Informationen zu Transaktionsgrenzwerten für Key Vault finden Sie in der Anleitung zur Drosselung von Azure Key Vault.For more information about Key Vault transaction limits, see Azure Key Vault throttling guidance.

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;

Aktualisieren Sie die Zeile await context.Response.WriteAsync("Hello World!"); so, dass sie wie folgt aussieht:Update the line await context.Response.WriteAsync("Hello World!"); to look like this line:

await context.Response.WriteAsync(secretValue);

Achten Sie darauf, dass Sie Ihre Änderungen speichern, bevor Sie mit dem nächsten Schritt fortfahren.Be sure to save your changes before continuing to the next step.

Erneutes Bereitstellen Ihrer Web-AppRedeploy your web app

Nachdem Sie Ihren Code aktualisiert haben, können Sie ihn mit diesen Git-Befehlen erneut in Azure bereitstellen:Now that you've updated your code, you can redeploy it to Azure by using these Git commands:

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

Navigieren zur fertigen Web-AppGo to your completed web app

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

Anstelle der zuvor angezeigten Nachricht „Hello World! sollte nun der Wert Ihres Geheimnisses angezeigt werden.Where before you saw "Hello World!", you should now see the value of your secret displayed.

Nächste SchritteNext steps