Руководство. Подключение 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
- Создание веб-приложения ASP.NET Core в Службе приложений Azure
- Развертывание локального репозитория Git в Службе приложений Azure
Необходимые компоненты
Для работы с этим учебником необходимы указанные ниже компоненты.
- Подписка Azure. Создайте ее бесплатно.
- Пакет SDK для .NET Core 3.1 или более поздней версии.
- Установка Git версии 2.28.0 или выше.
- Интерфейс командной строки Azure или Azure PowerShell.
- Azure Key Vault. Хранилище ключей можно создать с помощью портала Azure, Azure CLI или Azure PowerShell.
- Секрет Key Vault. Вы можете создать секрет с помощью портала Azure, PowerShell или Azure CLI.
Если ваше веб-приложение уже развернуто в Службе приложений 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"
}
Чтобы предоставить приложению разрешения для хранилища ключей с помощью контроль доступа на основе ролей (RBAC), назначьте роль с помощью команды Azure CLI az role assignment create.
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>"
Замените <app-id>
, <resource-group-name>
<subscription-id>
а <your-unique-keyvault-name>
также фактическими значениями. <app-id>
— это идентификатор приложения (клиента) зарегистрированного приложения в Microsoft Entra.
Изменение приложения для доступа к хранилищу ключей
При роботе с этим руководством вы будете использовать клиентскую библиотеку секретов 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", который мы видели раньше, отобразится значение секрета.
Следующие шаги
- Руководство. Использование Azure Key Vault с виртуальной машиной в .NET
- Дополнительные сведения см. в статье Использование управляемых удостоверений для ресурсов Azure.
- Изучите руководство для разработчиков
- Безопасный доступ к хранилищу ключей