【问题标题】:Azure KeyVault Configuration Provider reload values on changeAzure KeyVault 配置提供程序在更改时重新加载值
【发布时间】:2019-11-10 20:43:12
【问题描述】:

我正在使用 Azure Key Vault 配置提供程序在应用启动时读取一些机密。然而,秘密会在一天中不断轮换,我希望能够在轮换发生时重新加载新值。

我说的类似于reloadOnChange api

.ConfigureAppConfiguration((context, config) =>
{
    config.AddJsonFile("appsettings.json", reloadOnChange: true);
})

这可能吗?

这是一个 webapi 项目,因此在实践中,如果更好/更可行的话,我可以手动重新加载每个 HttpRequest 的值。

【问题讨论】:

  • 目前,每当你需要它时,我都会从 kv 那里得到秘密。有一个新的Azure App Config 功能(预览中)。它很有前途,会做你想做的事:docs.microsoft.com/en-us/azure/azure-app-configuration/overview
  • 您还可以创建一个端点来重新加载配置:IConfigurationRoot.Reload() 并在您更新 KV 中的机密时调用它。
  • @Thomas Azure App Config 服务与 KV 不同,它不是用于秘密存储。
  • @juunas 感谢您的评论,我误读了文档中的这一行:应用程序配置补充了用于存储应用程序机密的 Azure Key Vault。我以为它会提供一个统一的商店,也可以从 kv 中获取秘密。无论如何谢谢:-)

标签: c# .net azure asp.net-core azure-keyvault


【解决方案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 机密将可用并根据您的重新加载间隔刷新。

【讨论】:

    【解决方案2】:

    秘密被缓存直到IConfigurationRoot.Reload()被调用。在执行重新加载之前,应用程序不会尊重密钥保管库中过期、禁用和更新的机密。

    Configuration.Reload();
    

    更多详情可以参考这个article

    【讨论】:

    • 嘿,谢谢。我知道这个api。我希望以某种方式自动完成此操作。或者至少能够根据 Http 请求将其自动化。你知道有没有办法做到这一点?
    • 当您使用它并在浏览器中重新加载时,它会自动执行每个 Http 请求。
    【解决方案3】:

    与 Bobby Koteski 提议的相同,但使用更新的 Azure.Extensions.AspNetCore.Configuration.Secrets 包,因为 Microsoft.Extensions.Configuration.AzureKeyVault 已弃用。

    ReloadInterval 是轮询 Azure Key Vault 以进行更改的尝试之间的等待时间。

    configurationBuilder.AddAzureKeyVault(
        new SecretClient(
            new Uri(configuration["KeyVaultBaseUrl"]),
            new ManagedIdentityCredential(configuration["UserAssignedManagedIdentityClientId"])
        ),
        new AzureKeyVaultConfigurationOptions()
        {
            ReloadInterval = TimeSpan.FromSeconds(1000)
        }
    );
    

    a link to a source code 看看它实际上是如何工作的:)

    【讨论】:

    • 感谢您提供源代码。我很好奇正在使用什么 API 调用。
    猜你喜欢
    • 1970-01-01
    • 2020-07-18
    • 2023-02-20
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多