Конфигурация приложения 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