«Ошибка HTTP 502.5 - сбой процесса» при доступе к хранилищу ключей Azure в Azure PaaS через ASP.NET Core 2.1 WebAPI - PullRequest
0 голосов
/ 05 декабря 2018

Я получаю сообщение об ошибке «Ошибка HTTP 502.5 - сбой процесса» / «Операция вернула недопустимый код состояния« Запрещено »» при попытке доступа к хранилищу ключей Azure с идентификатором управляемой службы. Работает, когдаотладка в Visual Studio, но при публикации в веб-приложении Azure возвращается ошибка 502.5.

Я подозреваю, что это связано с разрешениями для хранилища ключей Azure. Поскольку я могу запустить это локально в Visual Studio (и это новое хранилище ключей) - я знаю, что у меня есть разрешение.Я не уверен, какой пользователь запускает веб-приложение, как в Azure, и подозреваю, что веб-приложению необходим доступ к хранилищу ключей, но я ожидал, что это будет обработано путем включения «Идентификации управляемых служб».

Как правильно настроить приложение для использования идентификатора управляемой службы для доступа к хранилищу ключей?

Действия для воспроизведения:

  1. Создание новой группы ресурсов на портале Azure
  2. Создание хранилища ключей 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'
    
  3. Создание веб-приложения в Azure. Включить идентификатор управляемой службы .

  4. Создать новый WebAPI ASP.NET Core 2.1 (я назвал его «MyKeyVaultTest.Service»).
  5. Добавитьпакеты NuGet:

    • AspNetCore.KeyVault
    • Microsoft.Azure.Services.AppAuthentication
  6. Редактирование файла appsettings.jsonдобавить URL Vault Key:

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*",
      "AppSettings": {
        "KeyVaultURL": "https://mytestkeyvault.vault.azure.net/"
      }
    }
    
  7. В файле 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>();
        }
    }
    
  8. В контроллере значений отредактируйте, чтобы он выглядел следующим образом:

    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 };
            }        
        }
    }
    
  9. Запустите в Visual Studio - обратите внимание, что значения api возвращают то, чтомы ожидаем:

    ["Hello","Goodbye"]
    
  10. Публикация в проекте в 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.&lt;&gt;c.&lt;CreateWebHostBuilder&gt;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&amp; 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
    

1 Ответ

0 голосов
/ 05 декабря 2018

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

После включения MSI в веб-приложении он будет отображаться как пользователь, которому могут быть назначены разрешения в конфигурации разрешений Key Vault.

...