Tutorial: Verwenden einer verwalteten Identität für die Verbindungsherstellung zwischen Key Vault und einer Azure-Web-App in .NET

Azure Key Vault ermöglicht das Speichern von Anmeldeinformationen und anderen Geheimnissen mit erhöhter Sicherheit. Für Ihren Code muss aber die Authentifizierung bei Key Vault erfolgen, damit der Abruf möglich ist. Dieses Problem können Sie anhand der Informationen unter Was sind verwaltete Identitäten für Azure-Ressourcen? lösen, indem Sie Azure-Diensten eine automatisch verwaltete Identität in Microsoft Entra ID bereitstellen. Sie können diese Identität für die Authentifizierung bei jedem Dienst verwenden, der die Microsoft Entra ID-Authentifizierung, einschließlich Key Vault, unterstützt. Hierfür müssen im Code keine Anmeldeinformationen angezeigt werden.

In diesem Tutorial führen Sie die Erstellung und Bereitstellung einer Azure-Webanwendung für Azure App Service durch. 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 für .NET und die Azure CLI nutzen. Die gleichen grundlegenden Prinzipien gelten auch, wenn Sie eine Entwicklungssprache Ihrer Wahl, Azure PowerShell bzw. das Azure-Portal nutzen.

Weitere Informationen zu Azure App Service-Webanwendungen und zur Bereitstellung in diesem Tutorial finden Sie unter:

Voraussetzungen

Für dieses Tutorial benötigen Sie Folgendes:

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.

Erstellen einer .NET Core-App

In diesem Schritt richten Sie das lokale .NET Core-Projekt ein.

Erstellen Sie in einem Terminalfenster auf Ihrem Computer ein Verzeichnis mit dem Namen akvwebapp, und wechseln Sie in dieses Verzeichnis:

mkdir akvwebapp
cd akvwebapp

Erstellen Sie eine .NET Core-App, indem Sie den Befehl dotnet new web verwenden:

dotnet new web

Führen Sie die Anwendung lokal aus, damit Sie wissen, wie sie beim Bereitstellen in Azure aussehen sollte:

dotnet run

Wechseln Sie in einem Webbrowser unter http://localhost:5000 zur App.

Auf der Seite wird die Nachricht „Hello World!“ aus der Beispiel-App angezeigt.

Weitere Informationen zur Erstellung von Webanwendungen für Azure finden Sie unter Schnellstart: Erstellen von ASP.NET Core-Web-Apps in Azure.

Bereitstellen der Anwendung in Azure

In diesem Schritt stellen Sie Ihre .NET Core-Anwendung unter Verwendung einer lokalen Git-Instanz in Azure App Service bereit. Weitere Informationen zum Erstellen und Bereitstellen von Anwendungen finden Sie unter Schnellstart: Erstellen von ASP.NET Core-Web-Apps in Azure.

Konfigurieren der lokalen Git-Bereitstellung

Drücken Sie im Terminalfenster STRG+C, um den Webserver zu schließen. Initialisieren Sie ein Git-Repository für das .NET Core-Projekt:

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. Nach der Konfiguration des Bereitstellungsbenutzers können Sie ihn für alle Azure-Bereitstellungen verwenden. Der Benutzername und das Kennwort für die Bereitstellung auf Kontoebene unterscheiden sich von den Anmeldeinformationen für Ihr Azure-Abonnement.

Führen Sie zum Konfigurieren des Bereitstellungsbenutzers den Befehl az webapp deployment user set aus. Wählen Sie einen Benutzernamen und das zugehörige Kennwort gemäß den folgenden Richtlinien aus:

  • Der Benutzername muss in Azure eindeutig sein. Bei lokalen Git-Pushvorgängen darf er kein at-Zeichen (@) enthalten.
  • Das Kennwort muss mindestens acht Zeichen lang sein und zwei der folgenden drei Elemente enthalten: Buchstaben, Zahlen und Symbole.
az webapp deployment user set --user-name "<username>" --password "<password>"

In der JSON-Ausgabe wird das Kennwort als null angezeigt. Wenn Sie den Fehler 'Conflict'. Details: 409 erhalten, müssen Sie den Benutzernamen ändern. Wenn Sie den Fehler 'Bad Request'. Details: 400 erhalten, müssen Sie ein sichereres Kennwort verwenden.

Notieren Sie Ihren Benutzernamen und das zugehörige Kennwort, damit Ihnen diese Angaben für die Bereitstellung Ihrer Web-Apps vorliegen.

Erstellen einer Ressourcengruppe

Eine Ressourcengruppe ist ein logischer Container, in dem Sie Azure-Ressourcen bereitstellen und verwalten. 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:

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

Wie erstelle ich einen Plan?

Erstellen Sie mit dem Azure CLI-Befehl az appservice plan create einen App Service-Plan. Im folgenden Beispiel wird ein App Service-Plan namens myAppServicePlan im Tarif FREE erstellt:

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:

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

Erstellen einer Web-App

Erstellen Sie eine Azure-Web-App im App Service-Plan myAppServicePlan.

Wichtig

Eine Azure-Web-App muss genau wie ein Schlüsseltresor einen eindeutigen Namen haben. Ersetzen Sie in den folgenden Beispielen <your-webapp-name> durch den Namen Ihrer Web-App.

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:

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. Speichern Sie diese URL. Sie benötigen die Information später.

Konfigurieren Sie nun Ihre Web-App für die Bereitstellung über den 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. Ersetzen Sie <your-webapp-name> durch den Namen Ihrer App.

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

Die Standardwebseite für eine neue Azure-Web-App wird angezeigt.

Bereitstellen Ihrer lokalen App

Kehren Sie zum lokalen Terminalfenster zurück, und fügen Sie Ihrem lokalen Git-Repository einen Azure-Remotespeicherort hinzu. 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.

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

git push azure main

Die Ausführung dieses Befehls kann einige Minuten dauern. Während der Ausführung werden Informationen der folgenden Art angezeigt:

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:

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

Die Nachricht „Hello World!“, die Sie zuvor beim Besuch von http://localhost:5000 gesehen haben, wird erneut angezeigt.

Weitere Informationen zur Bereitstellung einer Webanwendung per Git finden Sie unter Lokale Git-Bereitstellung in Azure App Service.

Konfigurieren der Web-App für die Verbindungsherstellung mit Key Vault

In diesem Abschnitt konfigurieren Sie den Webzugriff auf Key Vault und aktualisieren Ihren Anwendungscode, um ein Geheimnis aus Key Vault abzurufen.

Erstellen und Zuweisen einer verwalteten Identität

In diesem Tutorial verwenden wir eine verwaltete Identität für die Key Vault-Authentifizierung. Mit der verwalteten Identität werden die Anmeldeinformationen der Anwendung automatisch verwaltet.

Führen Sie über die Azure-Befehlszeilenschnittstelle den Befehl az webapp-identity assign aus, um die Identität für die Anwendung zu erstellen:

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

Vom Befehl wird der folgende JSON-Codeausschnitt zurückgegeben:

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

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.

Anpassen der App für den Zugriff auf Ihren Schlüsseltresor

In diesem Tutorial verwenden Sie zu Demonstrationszwecken die Azure Key Vault-Geheimnisclientbibliothek. Sie können auch die Azure Key Vault-Zertifikatclientbibliothek oder die Azure Key Vault-Schlüsselclientbibliothek verwenden.

Installieren der Pakete

Installieren Sie über das Terminalfenster die Pakete für die Azure Key Vault-Geheimnisclientbibliothek für .NET und die Azure Identity-Clientbibliothek:

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

Aktualisieren des Codes

Suchen und öffnen Sie die Datei Startup.cs für .NET 5.0 oder früher bzw. die Datei Program.cs für .NET 6.0 in Ihrem akvwebapp-Projekt.

Fügen Sie dem Header die folgenden Zeilen hinzu:

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

Fügen Sie die folgenden Zeilen vor dem app.UseEndpoints-Aufruf (.NET 5.0 oder früher) oder dem app.MapGet-Aufruf (.NET 6.0) ein, und aktualisieren Sie den URI, damit er dem vaultUri Ihres Schlüsseltresors entspricht. In diesem Code wird DefaultAzureCredential() für die Key Vault-Authentifizierung genutzt. Hierbei wird ein Token der verwalteten Identität für Authentifizierungszwecke verwendet. Weitere Informationen zur Key Vault-Authentifizierung finden Sie im Entwicklerhandbuch. Darüber hinaus wird im Code das exponentielle Backoff für Wiederholungen verwendet, falls Key Vault gedrosselt wird. Weitere Informationen zu Transaktionsgrenzwerten für Key Vault finden Sie in der Anleitung zur Drosselung von 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 oder früher

Aktualisieren Sie die Zeile await context.Response.WriteAsync("Hello World!"); so, dass sie wie folgt aussieht:

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

Aktualisieren Sie die Zeile app.MapGet("/", () => "Hello World!"); so, dass sie wie folgt aussieht:

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

Achten Sie darauf, dass Sie Ihre Änderungen speichern, bevor Sie mit dem nächsten Schritt fortfahren.

Erneutes Bereitstellen Ihrer Web-App

Nachdem Sie Ihren Code aktualisiert haben, können Sie ihn mit diesen Git-Befehlen erneut in Azure bereitstellen:

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

Navigieren zur fertigen Web-App

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

Anstelle der zuvor angezeigten Nachricht „Hello World! sollte nun der Wert Ihres Geheimnisses angezeigt werden.

Nächste Schritte