При объединении секретов хранилища ключей Azure в конфигурацию (AddAzureKeyVault), как обновлять секреты при их изменении?

У меня есть служба приложений C# ASP.NET Core, работающая в Azure. Ему нужны ключи для доступа к учетной записи хранения Azure. Он получает эти ключи из хранилища ключей Azure.

Моя проблема в том, что иногда я хочу менять эти ключи. Я хочу, чтобы приложение перезагружало ключи как можно более плавно, без чтения из хранилища ключей больше, чем необходимо.

В настоящее время мы делаем это во время запуска:

      Host.CreateDefaultBuilder(args)
    .ConfigureLogging(logging => logging.AddConsole())
    .ConfigureAppConfiguration((context, config) =>
    {
        var secretClient = new SecretClient(keyVaultUri, credential);
        config.AddAzureKeyVault(secretClient, new KeyVaultSecretManager());
    })

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

Каков наилучший способ обновить кэшированные секреты из хранилища ключей Azure после того, как приложение обнаружит, что старый секрет больше не действителен? Есть ли хороший способ сделать это без перезапуска приложения?

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

(Мне не нужно использовать AddAzureKeyVaultкак указано выше. Я могу заменить это чем-нибудь другим, если так будет удобнее.)

1 ответ

Решение

Используя Microsoft.Extensions.Configuration.AzureKeyVault (v3), вы можете делать следующее:

      configurationBuilder.AddAzureKeyVault(new AzureKeyVaultConfigurationOptions
{
    Vault = configuration["KeyVaultUrl"],
    ReloadInterval = TimeSpan.FromMinutes(10),
    Client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(
       new AzureServiceTokenProvider().KeyVaultTokenCallback))
});

Теперь, когда вы запрашиваете IConfiguration в ваших сервисах секреты KeyVault будут доступны и обновляться в зависимости от вашего интервала перезагрузки.

Другие вопросы по тегам