Samouczek: łączenie Key Vault z aplikacją internetową Azure w usłudze .NET przy użyciu tożsamości zarządzanej

Azure Key Vault umożliwia przechowywanie poświadczeń i innych wpisów tajnych ze zwiększonym bezpieczeństwem. Jednak kod musi uwierzytelnić się z Key Vault, aby je pobrać. Tożsamości zarządzane dla zasobów platformy Azure rozwiązują ten problem, zapewniając usługom platformy Azure automatycznie zarządzaną tożsamość w usłudze Microsoft Entra ID. Kod używa tej tożsamości do uwierzytelniania w dowolnej usłudze obsługującej uwierzytelnianie Microsoft Entra, w tym Key Vault, bez osadzania poświadczeń w kodzie.

W tym samouczku utworzysz i wdrożysz aplikację internetową Azure w celu Azure App Service, a następnie użyjesz tożsamości zarządzanej, aby uwierzytelnić aplikację w magazynie kluczy przy użyciu biblioteki klienta tajnego Azure Key Vault dla .NET i Azure CLI. Te same zasady mają zastosowanie, jeśli używasz innego języka, Azure PowerShell lub portalu Azure.

Aby uzyskać więcej informacji na temat aplikacji internetowych i wdrażania usługi App Service, zobacz:

Wymagania wstępne

Do ukończenia tego samouczka potrzebne są następujące elementy:

Jeśli masz już aplikację internetową wdrożona w Azure App Service, przejdź do sekcji Konfigurowanie aplikacji internetowej w celu nawiązania połączenia z Key Vault i Zmodyfikuj aplikację w celu uzyskania dostępu do key vault.

Tworzenie aplikacji .NET Core

W tym kroku skonfiguruj lokalny projekt .NET.

W oknie terminalu utwórz katalog o nazwie akvwebapp i przejdź do niego:

mkdir akvwebapp
cd akvwebapp

Utwórz aplikację internetową .NET przy użyciu polecenia dotnet new web:

dotnet new web

Uruchom aplikację lokalnie, aby zobaczyć, jak wygląda przed wdrożeniem jej w Azure:

dotnet run

W przeglądarce internetowej otwórz aplikację pod adresem http://localhost:5000. Zostanie wyświetlony komunikat "Hello world!" z przykładowej aplikacji.

Aby uzyskać więcej informacji na temat tworzenia aplikacji internetowych, zobacz Tworzenie aplikacji internetowej ASP.NET Core w Azure App Service.

Wdrażanie aplikacji w Azure

W tym kroku wdroż aplikację platformy .NET do usługi Azure App Service za pomocą funkcji zip deploy. Wdrażanie z pliku ZIP jest zalecanym mechanizmem wdrażania pakietów dla usługi App Service. W przypadku ciągłego dostarczania z systemu kontroli źródła użyj zamiast tego GitHub Actions lub Azure DevOps Pipelines.

Tworzenie grupy zasobów

Utwórz grupę zasobów zawierającą magazyn kluczy i aplikację internetową przy użyciu polecenia az group create:

az group create --name "<resource-group>" --location "EastUS"

Tworzenie planu usługi App Service

Utwórz plan usługi App Service przy użyciu polecenia az appservice plan create. Poniższy przykład tworzy plan o nazwie myAppServicePlan w bezpłatnej warstwie (FREE):

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

Tworzenie aplikacji internetowej

Utwórz aplikację internetową Azure w myAppServicePlan planie.

Ważne

Podobnie jak magazyn kluczy, aplikacja internetowa Azure musi mieć globalnie unikatową nazwę. Zastąp znacznik <webapp-name> nazwą swojej aplikacji internetowej.

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

Przejdź do nowej aplikacji, aby potwierdzić, że jest uruchomiona:

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

Zostanie wyświetlona strona domyślna dla nowej aplikacji internetowej Azure.

Wdrażanie aplikacji lokalnej przy użyciu narzędzia zip deploy

Z katalogu projektu akvwebapp skompiluj projekt i utwórz wdrożeniowe archiwum ZIP:

dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..

Tip

W systemie Windows bez zip użyj programu PowerShell: Compress-Archive -Path .\publish\* -DestinationPath .\akvwebapp.zip.

Wdróż plik zip do swojej aplikacji internetowej za pomocą az webapp deploy:

az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip

Odśwież wdrożoną aplikację w przeglądarce internetowej:

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

Zostanie wyświetlony ten sam komunikat "Hello world!", który został wyświetlony pod adresem http://localhost:5000.

Konfigurowanie aplikacji internetowej w celu nawiązania połączenia z Key Vault

W tej sekcji włączysz aplikację internetową, aby uzyskać dostęp do Key Vault i zaktualizować kod aplikacji w celu pobrania wpisu tajnego.

Tworzenie i przypisywanie dostępu do tożsamości zarządzanej

Użyj tożsamości zarządzanej do uwierzytelniania aplikacji internetowej w usłudze Key Vault. Tożsamość zarządzana eliminuje potrzebę zarządzania poświadczeniami w kodzie.

Przypisz tożsamość do aplikacji za pomocą az webapp identity assign:

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

Polecenie zwraca fragment kodu JSON podobny do następującego:

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

Aby uzyskać uprawnienia do magazynu kluczy za pomocą Role-Based Access Control (RBAC), przypisz rolę do głównej nazwy użytkownika (UPN) przy użyciu polecenia Azure CLI az role assignment create.

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

Zastąp <upn>, <subscription-id> i <vault-name> rzeczywistymi wartościami. Jeśli użyto innej nazwy grupy zasobów, zastąp "myResourceGroup" również. Twój UPN zazwyczaj będzie w formacie adresu e-mail (np. username@domain.com).

Modyfikowanie aplikacji w celu uzyskania dostępu do magazynu kluczy

W tym samouczku jest używana biblioteka klienta wpisu tajnego Azure Key Vault. Możesz również użyć biblioteki klienta certyfikatu Azure Key Vault lub biblioteki klienta klucza Azure Key Vault.

Instalowanie pakietów

W oknie terminalu zainstaluj bibliotekę klienta wpisu tajnego Azure Key Vault i bibliotekę klienta Azure Identity:

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

Aktualizacja kodu

Otwórz Program.cs w projekcie akvwebapp .

Dodaj następujące using dyrektywy w górnej części pliku:

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

Dodaj następujące wiersze przed wywołaniem app.MapGet, zastępując element <vault-name> nazwą magazynu kluczy. Ten kod używa DefaultAzureCredential do uwierzytelniania w usłudze Key Vault za pośrednictwem tożsamości zarządzanej aplikacji internetowej. Aby uzyskać więcej informacji, zobacz przewodnik dewelopera. Kod konfiguruje również wycofywanie wykładnicze dla ponownych prób w przypadku ograniczenia Key Vault. Aby uzyskać szczegółowe informacje na temat limitów transakcji, zobacz wskazówki dotyczące ograniczania przepustowości 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://<vault-name>.vault.azure.net/"), new DefaultAzureCredential(), options);

KeyVaultSecret secret = client.GetSecret("<secret-name>");

string secretValue = secret.Value;

Zaktualizuj wiersz app.MapGet("/", () => "Hello world!"); do:

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

Zapisz zmiany.

Ponowne wdrażanie aplikacji internetowej

Ponownie skompiluj pakiet wdrożeniowy i ponownie wdróż:

dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..
az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip

Przejdź do ukończonej aplikacji internetowej

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

Tam, gdzie wcześniej widniał napis „Hello world!”, teraz widzisz wartość Twojego sekretu.

Dalsze kroki