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

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

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

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

Необходимые компоненты

Для работы с этим учебником необходимы указанные ниже компоненты.

Если ваше веб-приложение уже развернуто в Службе приложений Azure, вы можете перейти к разделам Настройка доступа веб-приложения к хранилищу ключей и Изменение кода веб-приложения.

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

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

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

mkdir akvwebapp
cd akvwebapp

Теперь создайте приложение .NET Core с помощью команды dotnet new web.

dotnet new web

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

dotnet run

В веб-браузере перейдите к приложению по адресу http://localhost:5000.

На странице отобразится сообщение "Hello World!", созданное примером приложения.

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

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

На этом шаге вы развернете приложение .NET Core в Службе приложений с помощью локального репозитория Git. Дополнительные сведения о создании и развертывании приложений см. в статье Создание веб-приложения ASP.NET Core в Azure

Настройка локального развертывания Git

В окне терминала нажмите клавиши CTRL+C, чтобы закрыть веб-сервер. Инициализируйте репозиторий Git для проекта .NET Core.

git init --initial-branch=main
git add .
git commit -m "first commit"

Для развертывания веб-приложения Azure можно использовать FTP и локальный репозиторий Git, работая как пользователь развертывания. Настроив пользователя развертывания, вы сможете использовать его для всех последующих развертываний в Azure. Имя пользователя и пароль для учетной записи развертывания отличаются от учетных данных подписки Azure.

Чтобы настроить пользователя для развертывания, выполните команду az webapp deployment user set. Выберите имя пользователя и пароль согласно следующим рекомендациям:

  • Имя пользователя должно быть уникальным в пределах Azure. Для отправки обновлений из локального репозитория Git имя не может содержать символ @.
  • Пароль должен содержать не менее восьми символов и включать два из трех следующих элементов: буквы, цифры и символы.
az webapp deployment user set --user-name "<username>" --password "<password>"

В выходных данных JSON пароль отображается как null. Если появляется сообщение об ошибке 'Conflict'. Details: 409, измените имя пользователя. Если появляется сообщение об ошибке 'Bad Request'. Details: 400, используйте более надежный пароль.

Запишите имя пользователя и пароль, чтобы в будущем использовать их для развертывания веб-приложений.

Создание или изменение группы ресурсов

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

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

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

Создайте план службы приложений, выполнив команду az appservice plan create в Azure CLI. В следующем примере создается план службы приложений с именем myAppServicePlan и ценовой категорией FREE.

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

После создания плана службы приложений Azure CLI отображает следующие сведения.

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

См. сведения о том, как управлять планом службы приложений в Azure.

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

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

Важно!

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

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

При создании веб-приложения в Azure CLI отображаются следующие выходные данные.

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

URL-адрес удаленного репозитория Git отображается в свойстве deploymentLocalGitUrl и имеет формат https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git. Сохраните этот URL-адрес. Оно понадобится вам позже.

После этого настройте свое веб-приложение для развертывания из ветвиmain:

 az webapp config appsettings set -g MyResourceGroup --name "<your-webapp-name>" --settings deployment_branch=main

Войдите в приложение с помощью следующей команды. Замените <your-webapp-name> реальным именем приложения.

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

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

Развертывание локального приложения

Вернитесь к окну терминала (в локальном расположении) и добавьте удаленное приложение Azure в локальный репозиторий Git. В следующей команде замените <deploymentLocalGitUrl-from-create-step> URL-адресом удаленного репозитория Git (см. раздел Создание веб-приложения).

git remote add azure <deploymentLocalGitUrl-from-create-step>

Отправьте код в удаленный репозиторий Azure, чтобы развернуть приложение, с помощью следующей команды. Когда диспетчер учетных данных Git отобразит запрос на ввод учетных данных, введите значения, созданные на шаге Настройка локального развертывания Git.

git push azure main

Выполнение этой команды может занять несколько минут. После завершения отобразятся следующие сведения.

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

Откройте или обновите в браузере страницу развернутого приложения.

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

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

Дополнительные сведения о развертывании веб-приложения с помощью Git см. в статье Локальное развертывание Git в Службе приложений Azure.

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

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

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

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

В Azure CLI выполните команду az webapp-identity assign, чтобы создать удостоверение для этого приложения.

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

Эта команда вернет следующий фрагмент JSON.

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

Чтобы предоставить веб-приложению разрешение на выполнение операций get и list в хранилище ключей, передайте значение principalId в команду Azure CLI az keyvault set-policy.

az keyvault set-policy --name "<your-keyvault-name>" --object-id "<principalId>" --secret-permissions get list

Политики доступа также можно назначать с помощью портала Azure или PowerShell.

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

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

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

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

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

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

Найдите и откройте файл Startup.cs для .NET 5.0 или более ранней версии либо файл Program.cs для .NET 6.0 в проекте akvwebapp.

Добавьте следующие строки в заголовок:

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

Добавьте следующие строки перед вызовом app.UseEndpoints (.NET 5.0 или более ранней версии) или app.MapGet вызовом (.NET 6.0), обновив URI, чтобы отразить vaultUri хранилище ключей. Этот код использует DefaultAzureCredential() для проверки подлинности в Key Vault, для которой используется маркер из управляемого удостоверения. Дополнительные сведения о проверке подлинности в Key Vault см. в руководстве для разработчиков. В этом коде также реализована экспоненциальная задержка для повторных попыток на случай регулирования запросов к 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://<your-unique-key-vault-name>.vault.azure.net/"), new DefaultAzureCredential(),options);

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

string secretValue = secret.Value;
.NET 5.0 и более ранние версии

Измените строку await context.Response.WriteAsync("Hello World!"); следующим образом.

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

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

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

Не забудьте сохранить внесенные изменения, прежде чем переходить к следующему шагу.

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

Теперь, когда вы изменили код, его можно повторно развернуть в Azure с помощью следующих команд Git.

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

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

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

Вместо текста "Hello World", который мы видели раньше, отобразится значение секрета.

Следующие шаги