Конфигурация приложения Azure, хранилище ключей и удостоверение управляемой службы (.NET Core 3.1)

У меня есть простая служба приложений, настроенная для использования / тестирования конфигурации приложения Azure.

  • Конфигурация приложения Azure содержит 2 записи, не относящиеся к KeyVault, и 1 запись, которая является ссылкой на Key Vault.
  • Хранилище ключей настроено с соответствующей политикой доступа, позволяющей получить / список секретов для удостоверения управляемой службы в конфигурации приложения Azure.

Я следил за примером приложения, поэтому CreateHostBuilder выглядит так:

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
{
    var settings = config.Build();
    config.AddAzureAppConfiguration(settings["ConnectionStrings:AppConfig"]);
})
.UseStartup<Startup>());

При развертывании / запуске приложения поведение считается успешным, если нет записей конфигурации приложения Azure, указывающих на KeyVault.

Когда я добавляю в конфигурацию приложения Azure запись, которая указывает на KeyVault, приложение не запускается (ошибка HTTP 500.30 - сбой запуска в процессе ANCM), в журналах отображается это исключение:

Информация об исключении: Microsoft.Extensions.Configuration.AzureAppConfiguration.KeyVaultReferenceException: учетные данные хранилища ключей не настроены и соответствующий секретный клиент не найден.. ErrorCode:, Key:TestConnectionString, Label:, Etag:6ezsqW96CsAet7Ym5H4DedsLTkI, httpsIdenhttps://testkeyvault.vault.azure.net/secrets/TestSecret ---> System.UnauthorizedAccessException: учетные данные хранилища ключей не настроены, и соответствующий секретный клиент не найден.

Кажется очевидным, что что-то не защищено правильно, но я много раз проверял, и в Key Vault есть политика доступа, предоставляющая Get/List of Secrets для удостоверения конфигурации приложения Azure.

Я также пробовал опцию ConfigureKeyVault в компоновщике хоста, т.е.

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
    {
        var settings = config.Build();

        config.AddAzureAppConfiguration(options =>
        {
            options.Connect(settings["ConnectionStrings:AppConfig"])
                    .ConfigureKeyVault(kv =>
                    {
                        kv.SetCredential(new DefaultAzureCredential());
                    });
        });
    })
    .UseStartup<Startup>());

Предоставляет ли политика доступа в Key Vault получение / список секретов для удостоверения конфигурации приложения Azure все, что нужно сделать, или я что-то пропустил? (Я также пытался предоставить политику доступа службе приложений, не повезло).

2 ответа

Решение

Для ссылок на хранилище ключей приложение должно настроить аутентификацию как для конфигурации приложения, так и для хранилища ключей. Эти две службы не обмениваются данными напрямую, поэтому конфигурации приложения не требуются какие-либо разрешения на доступ к Key Vault. Фрагмент кода с использованиемConfigureKeyVaultправильно. Он указываетDefaultAzureCredential будет использоваться для аутентификации в Key Vault с целью разрешения ссылок на хранилище ключей.

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

Для среды разработки эти инструкции можно использовать для создания субъекта-службы, предоставления разрешений и настройки соответствующих переменных среды, которые будут использоватьсяDefaultAzureCredential.

Для .Net 6.0 я выполнил установку двух пакетов NuGet.

      Microsoft.Extensions.Configuration.AzureAppConfiguration
Azure.Identity
Другие вопросы по тегам