Freigeben über


Lernprogramm: Verwenden einer verwalteten Identität zum Verbinden von Key Vault mit einer Azure Web-App in .NET

Azure Key Vault bietet eine Möglichkeit zum Speichern von Anmeldeinformationen und anderen geheimen Schlüsseln mit erhöhter Sicherheit. Ihr Code muss sich jedoch bei Key Vault authentifizieren, um sie abzurufen. Verwaltete Identitäten für Azure-Ressourcen helfen, dieses Problem zu lösen, indem sie Azure-Diensten eine automatisch verwaltete Identität in Microsoft Entra ID bereitstellen. Sie können diese Identität verwenden, um sich bei jedem Dienst zu authentifizieren, der Microsoft Entra Authentifizierung unterstützt, einschließlich Key Vault, ohne anmeldeinformationen im Code anzeigen zu müssen.

In diesem Lernprogramm erstellen und bereitstellen Sie Azure Webanwendung für Azure App Service. Sie verwenden eine verwaltete Identität, um Ihre Azure-Web-App mit einem Azure Key Vault zu authentifizieren, indem Sie die Azure Key Vault Secret Client-Bibliothek für .NET und die Azure CLI verwenden. Die gleichen Grundprinzipien gelten, wenn Sie die Entwicklungssprache Ihrer Wahl, Azure PowerShell und/oder das Azure Portal verwenden.

Weitere Informationen zu Azure-App Dienstwebanwendungen und zur Bereitstellung, die in diesem Lernprogramm vorgestellt werden, finden Sie unter:

Voraussetzungen

Um dieses Lernprogramm abzuschließen, benötigen Sie Folgendes:

Wenn Ihre Webanwendung bereits in Azure App Service bereitgestellt wurde, können Sie zu Konfigurieren des Webanwendungszugriffs auf einen Key Vault und Ändern des Webanwendungscodes überspringen.

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 mithilfe des Befehls dotnet new web:

dotnet new web

Führen Sie die Anwendung lokal aus, damit Sie wissen, wie sie aussehen sollte, wenn Sie sie für Azure bereitstellen:

dotnet run

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

Die Meldung "Hallo Welt!" der Beispiel-App wird auf der Seite angezeigt.

Weitere Informationen zum Erstellen von Webanwendungen für Azure finden Sie unter Create an ASP.NET Core Web App in Azure App Service

Bereitstellen der App für Azure

In diesem Schritt stellen Sie Ihre .NET Core-Anwendung mithilfe von lokalem Git auf Azure App Service bereit. Weitere Informationen zum Erstellen und Bereitstellen von Anwendungen finden Sie unter Create an ASP.NET Core Web App 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 FTP und lokale Git verwenden, um eine Azure Web-App mithilfe eines Deployment-Benutzers bereitzustellen. Nachdem Sie ihren Bereitstellungsbenutzer konfiguriert haben, können Sie ihn für alle Ihre Azure Bereitstellungen verwenden. Der Benutzername und das Kennwort für die Bereitstellung auf Kontoebene unterscheiden sich von Ihren Azure Abonnementanmeldeinformationen.

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 innerhalb 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 Kennwort, damit Sie sie für die Bereitstellung Ihrer Web-Apps verwenden können.

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 "<resource-group>" -l "EastUS"

Einen App Service-Plan erstellen

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

az appservice plan create --name myAppServicePlan --resource-group <resource-group> --sku FREE

Wenn der App Service-Plan erstellt wird, werden im Azure CLI Informationen ähnlich wie hier angezeigt:

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

Weitere Informationen finden Sie unter Manage an App Service plan in Azure.

Erstellen einer Web-App

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

Wichtig

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

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

Wenn die Web-App erstellt wird, zeigt die Azure CLI die Ausgabe ähnlich wie hier gezeigt an:

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-Remote wird in der deploymentLocalGitUrl-Eigenschaft im Format https://<username>@<webapp-name>.scm.azurewebsites.net/<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 "<webapp-name>" --settings deployment_branch=main

Navigieren Sie mit dem folgenden Befehl zu Ihrer neuen App. Ersetzen Sie <webapp-name> durch den Namen Ihrer App.

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

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

Bereitstellen Ihrer lokalen App

Fügen Sie im lokalen Terminalfenster Ihrem lokalen Git-Repository eine Azure-Remote hinzu. Ersetzen Sie im folgenden Befehl <deployment-url> durch die URL des Git-Remotespeicherorts, die Sie im Abschnitt Erstellen einer Web-App gespeichert haben.

git remote add azure <deployment-url>

Verwenden Sie den folgenden Befehl, um an das Azure-Remote zu pushen und Ihre App zu deployen. 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://<webapp-name>.azurewebsites.net

Sie sehen die Meldung "Hallo Welt!", die Sie zuvor gesehen haben, als Sie http://localhost:5000 besucht haben.

Weitere Informationen zum Bereitstellen von Webanwendungen mit Git finden Sie unter Local Git deployment to Azure App Service

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

In diesem Abschnitt konfigurieren Sie den Webzugriff auf Key Vault und aktualisieren Ihren Anwendungscode, um einen geheimen Schlüssel aus Key Vault abzurufen.

Erstellen einer verwalteten Identität und Zuweisen des Zugriffs

In diesem Lernprogramm verwenden wir managed Identity zum Authentifizieren bei Key Vault. Mit der verwalteten Identität werden die Anmeldeinformationen der Anwendung automatisch verwaltet.

Führen Sie im Azure CLI zum Erstellen der Identität für die Anwendung den Befehl az webapp-identity assign aus:

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

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

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

Um über die rollenbasierte Zugriffskontrolle (Role-Based Access Control, RBAC) Berechtigungen für Ihren Schlüsseltresor zu erhalten, weisen Sie Ihrem Benutzerprinzipalname (User Principal Name, UPN) mit dem Azure CLI-Befehl az role assignment create eine Rolle zu.

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

Ersetzen Sie <upn>, <subscription-id> und <vault-name> durch Ihre tatsächlichen Werte. Wenn Sie einen anderen Ressourcengruppennamen verwendet haben, ersetzen Sie auch "myResourceGroup". Ihr Benutzerprinzipalname (UPN) hat in der Regel das Format einer E-Mail-Adresse (z. B. username@domain.com).

Ändern Sie die App, um Zugriff auf Ihren Schlüsseltresor zu erhalten.

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

Installieren der Pakete

Installieren Sie im Terminalfenster die Azure Key Vault geheime Clientbibliothek für .NET- und Azure Identity-Clientbibliothekspakete:

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

Aktualisieren des Codes

Suchen und öffnen Sie die Startup.cs Datei für .NET 5.0 oder früher oder Program.cs Datei 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. Dieser Code verwendet DefaultAzureCredential() zum Authentifizieren bei Key Vault, bei dem ein Token aus verwalteter Identität zum Authentifizieren verwendet wird. Weitere Informationen zur Authentifizierung für Key Vault finden Sie im Handbuch Developer. Darüber hinaus wird im Code das exponentielle Backoff für Wiederholungen verwendet, falls Key Vault gedrosselt wird. Weitere Informationen zu Key Vault Transaktionsgrenzwerten finden Sie unter Azure Key Vault Einschränkungsleitfaden.

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 oder früher

Aktualisieren Sie die Zeile await context.Response.WriteAsync("Hallo Welt!"); so, dass sie wie diese Zeile aussieht:

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

Aktualisieren Sie die Zeile app.MapGet("/", () => "Hallo Welt!"); so, dass sie wie diese Zeile 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 den folgenden Git-Befehlen erneut für 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://<webapp-name>.azurewebsites.net

Anstelle der zuvor angezeigten Nachricht „Hallo Welt! sollte nun der Wert Ihres Geheimnisses angezeigt werden.

Nächste Schritte