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:
- App Service: Übersicht
- Schnellstart: Erstellen von ASP.NET Core-Web-Apps in Azure
- Lokale Git-Bereitstellung in Azure App Service
Voraussetzungen
Für dieses Tutorial benötigen Sie Folgendes:
- Ein Azure-Abonnement. Erstellen Sie ein kostenloses Abonnement.
- .NET Core 3.1 SDK (oder höher).
- Installation von Git-Version 2.28.0 oder einer höheren Version
- Die Azure CLI oder Azure PowerShell.
- Azure Key Vault: Sie können eine Azure Key Vault-Instanz erstellen, indem Sie das Azure-Portal, die Azure CLI oder Azure PowerShell verwenden.
- Ein Key Vault-Geheimnis. Sie können ein Geheimnis erstellen, indem Sie das Azure-Portal, PowerShell oder die Azure CLI verwenden.
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 einer verwalteten Identität und Zuweisen des Zugriffs
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"
}
Um Ihrem Schlüsseltresor über die rollenbasierte Zugriffssteuerung (Role-Based Access Control, RBAC) Berechtigungen für Ihre Anwendung zu gewähren, weisen Sie mithilfe des Azure CLI-Befehls az role assignment create eine Rolle zu.
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>"
Ersetzen Sie <app-id>
, <subscription-id>
, <resource-group-name>
und <your-unique-keyvault-name>
durch Ihre tatsächlichen Werte. <app-id>
ist die Anwendungs-ID (Client-ID) Ihrer registrierten Anwendung in Microsoft Entra.
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
- Tutorial: Verwenden von Azure Key Vault mit einem virtuellen Computer in .NET
- Weitere Informationen zu verwalteten Identitäten für Azure-Ressourcen finden Sie hier.
- Sehen Sie sich das Entwicklerhandbuch an.
- Sicherer Zugriff auf einen Schlüsseltresor