Руководство. Использование управляемого удостоверения для подключения Key Vault к веб-приложению Azure в .NET

Azure Key Vault предоставляет способ хранения учетных данных и других секретов с повышенным безопасностью. Код должен пройти аутентификацию в Key Vault, чтобы получить их. Управляемые удостоверения для ресурсов Azure решают эту проблему, предоставляя службам Azure автоматически управляемое удостоверение в Microsoft Entra ID. Ваш код использует эту идентичность для аутентификации в любой службе, которая поддерживает аутентификацию Microsoft Entra, включая Key Vault, не встраивая учетные данные в код.

В этом руководстве описано, как создать и развернуть веб-приложение Azure для Служба приложений Azure, а затем использовать управляемое удостоверение для проверки подлинности приложения в хранилище ключей с помощью клиентской библиотеки секретов Azure Key Vault для .NET и Azure CLI. Те же принципы применяются, если вы используете другой язык, Azure PowerShell или портал Azure.

Дополнительные сведения о веб-приложениях и развертывании службы приложений см. в следующем разделе:

Предпосылки

Чтобы завершить работу с этим руководством, вам потребуется:

Если у вас уже есть веб-приложение, развернутое в Служба приложений Azure, перейдите к разделу "Настройка веб-приложения для подключения к Key Vault" и "Изменение приложения для доступа к key vault".

Создание приложения .NET Core

На этом шаге настройте локальный проект .NET.

В окне терминала создайте каталог с именем akvwebapp и переключитесь на него:

mkdir akvwebapp
cd akvwebapp

Создайте веб-приложение .NET с помощью команды dotnet new web:

dotnet new web

Запустите приложение локально, чтобы узнать, как он выглядит, прежде чем развертывать его в Azure:

dotnet run

Откройте приложение http://localhost:5000в веб-браузере. В примере приложения отображается сообщение "Hello World!".

Дополнительные сведения о создании веб-приложений см. в разделе "Создание веб-приложения ASP.NET Core" в Служба приложений Azure.

Развертывание приложения в Azure

На этом шаге разверните приложение .NET для Служба приложений Azure с помощью ZIP-развертывания. Zip-развертывание — это рекомендуемый механизм развертывания на основе пакетов для службы приложений. Для непрерывной доставки из системы контроля версий используйте вместо этого GitHub Actions или Azure DevOps Pipelines.

Создайте группу ресурсов

Создайте группу ресурсов для хранения хранилища ключей и веб-приложения с помощью az group create:

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

Создание плана службы приложений

Создайте план службы приложений с помощью az appservice plan create. В следующем примере создается план с именем myAppServicePlan в бесплатном (FREE) уровне:

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

Создание веб-приложения

Создайте веб-приложение Azure в myAppServicePlan плане.

Это важно

Как и в хранилище ключей, веб-приложение Azure должно иметь глобально уникальное имя. Замените <webapp-name> именем веб-приложения.

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

Перейдите к новому приложению, чтобы подтвердить его выполнение:

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

Вы увидите страницу по умолчанию для нового веб-приложения Azure.

Разверните локальное приложение с помощью zip-развертывания

В каталоге akvwebapp проекта создайте проект и создайте ZIP-файл развертывания:

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

Tip

В Windows без zip используйте PowerShell: Compress-Archive -Path .\publish\* -DestinationPath .\akvwebapp.zip

Разверните ZIP-файл в веб-приложении с помощью az webapp deploy:

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

Обновите развернутое приложение в веб-браузере:

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

Вы видите то же самое сообщение "Hello World!", которое вы видели в http://localhost:5000.

Настройка веб-приложения для подключения к Key Vault

В этом разделе описано, как разрешить веб-приложению получать доступ к Key Vault и обновлять код приложения для получения секрета.

Создание и назначение доступа к управляемому удостоверению

Используйте управляемое удостоверение для проверки подлинности веб-приложения для Key Vault. Управляемое удостоверение устраняет необходимость управлять учетными данными в коде.

Создайте удостоверение для приложения с помощью az webapp identity assign:

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

Команда возвращает фрагмент JSON, аналогичный следующему:

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

Чтобы получить разрешения для хранилища ключей через Role-Based контроль доступа (RBAC), назначьте роль вашему "User Principal Name" (UPN) с помощью команды 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>"

Замените <upn>, <subscription-id>а <vault-name> также фактическими значениями. Если вы использовали другое имя группы ресурсов, замените myResourceGroup. Ваше Уникальное Имя Пользователя (UPN) обычно имеет формат адреса электронной почты (например, username@domain.com).

Изменение приложения для доступа к хранилищу ключей

В этом руководстве используется клиентская библиотека секретов Azure Key Vault. Вы также можете использовать клиентскую библиотеку для сертификатов Azure Key Vault или клиентскую библиотеку для ключей Azure Key Vault.

Установка пакетов

В окне терминала установите клиентскую библиотеку для секретов Azure Key Vault и клиентскую библиотеку Azure Identity:

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

Обновление кода

Откройте Program.cs в вашем проекте akvwebapp.

Добавьте эти using директивы в начало файла:

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

Добавьте следующие строки перед вызовом app.MapGet, заменив <vault-name> на имя своего хранилища ключей. Этот код использует DefaultAzureCredential для аутентификации в Key Vault через управляемую идентичность веб-приложения. Дополнительные сведения см. в руководстве разработчика. Код также настраивает экспоненциальную задержку между повторными попытками на случай, если Key Vault начнёт ограничивать запросы. Дополнительные сведения об ограничениях транзакций см. в 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;

Обновите строку app.MapGet("/", () => "Hello World!"); следующим способом:

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

Сохраните свои изменения.

Повторное развертывание веб-приложения

Пересоберите пакет развертывания и повторно разверните:

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

Переход на страницу готового веб-приложения

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

Там, где раньше вы видели "Hello World!", теперь вы видите значение вашего секрета.

Дальнейшие шаги