Я получаю сообщение об ошибке «Ошибка HTTP 502.5 - сбой процесса» / «Операция вернула недопустимый код состояния« Запрещено »» при попытке доступа к хранилищу ключей Azure с идентификатором управляемой службы. Работает, когдаотладка в Visual Studio, но при публикации в веб-приложении Azure возвращается ошибка 502.5.
Я подозреваю, что это связано с разрешениями для хранилища ключей Azure. Поскольку я могу запустить это локально в Visual Studio (и это новое хранилище ключей) - я знаю, что у меня есть разрешение.Я не уверен, какой пользователь запускает веб-приложение, как в Azure, и подозреваю, что веб-приложению необходим доступ к хранилищу ключей, но я ожидал, что это будет обработано путем включения «Идентификации управляемых служб».
Как правильно настроить приложение для использования идентификатора управляемой службы для доступа к хранилищу ключей?
Действия для воспроизведения:
- Создание новой группы ресурсов на портале Azure
Создание хранилища ключей Azure (я назвал его «mytestkeyvault»).Добавьте два секрета: secret1, secret2, добавьте в них кое-что (я использовал этот CLI-скрипт Azure для добавления привет / до свидания)
az keyvault secret set --vault-name 'mytestkeyvault' --name 'Secret1' --value 'Hello'
az keyvault secret set --vault-name 'mytestkeyvault' --name 'Secret2' --value 'Goodbye'
Создание веб-приложения в Azure. Включить идентификатор управляемой службы .
- Создать новый WebAPI ASP.NET Core 2.1 (я назвал его «MyKeyVaultTest.Service»).
Добавитьпакеты NuGet:
- AspNetCore.KeyVault
- Microsoft.Azure.Services.AppAuthentication
Редактирование файла appsettings.jsonдобавить URL Vault Key:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"AppSettings": {
"KeyVaultURL": "https://mytestkeyvault.vault.azure.net/"
}
}
В файле program.cs отредактируйте файл, чтобы он выглядел следующим образом, чтобы подключиться к appsettings.json и подключиться к keyvault:
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
namespace MyKeyVaultTest.Service
{
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
IConfigurationRoot builtConfig = config.Build();
ConfigurationBuilder keyVaultConfigBuilder = new ConfigurationBuilder();
keyVaultConfigBuilder.AddAzureKeyVault(builtConfig["AppSettings:KeyVaultURL"]);
IConfigurationRoot keyVaultConfig = keyVaultConfigBuilder.Build();
config.AddConfiguration(keyVaultConfig);
})
.UseStartup<Startup>();
}
}
В контроллере значений отредактируйте, чтобы он выглядел следующим образом:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System.Collections.Generic;
namespace MyKeyVaultTest.Service.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly IConfiguration _configuration;
public ValuesController(IConfiguration configuration)
{
_configuration = configuration;
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
string secret1 = _configuration["Secret1"];
string secret2 = _configuration["Secret2"];
return new string[] { secret1, secret2 };
}
}
}
Запустите в Visual Studio - обратите внимание, что значения api возвращают то, чтомы ожидаем:
["Hello","Goodbye"]
Публикация в проекте в Azure.Обратите внимание, что он не работает и возвращает:
Ошибка HTTP 502,5 - сбой процесса
Полный стек ошибок:
Description: The process was terminated due to an unhandled exception.
Exception Info: Microsoft.Azure.KeyVault.Models.KeyVaultErrorException: Operation returned an invalid status code 'Forbidden'
at Microsoft.Azure.KeyVault.KeyVaultClient.GetSecretsWithHttpMessagesAsync(String vaultBaseUrl, Nullable`1 maxresults, Dictionary`2 customHeaders, CancellationToken cancellationToken)
at Microsoft.Azure.KeyVault.KeyVaultClientExtensions.GetSecretsAsync(IKeyVaultClient operations, String vaultBaseUrl, Nullable`1 maxresults, CancellationToken cancellationToken)
at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.LoadAsync()
at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.Load()
at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
at MyKeyVaultTest.Service.Program.<>c.<CreateWebHostBuilder>b__1_0(WebHostBuilderContext context, IConfigurationBuilder config) in D:\a\1\s\MyKeyVaultTest\MyKeyVaultTest.Service\Program.cs:line 27
at Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices(AggregateException& hostingStartupErrors)
at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
at MyKeyVaultTest.Service.Program.Main(String[] args) in D:\a\1\s\MyKeyVaultTest\MyKeyVaultTest.Service\Program.cs:line 17