Azure KeyVault 配置提供程序在更改时重新加载值

reg*_*ahn 6 .net c# azure azure-keyvault asp.net-core

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

我说的类似于reloadOnChangeapi

.ConfigureAppConfiguration((context, config) =>
{
    config.AddJsonFile("appsettings.json", reloadOnChange: true);
})
Run Code Online (Sandbox Code Playgroud)

这可能吗?

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

小智 14

使用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))
});
Run Code Online (Sandbox Code Playgroud)

现在,当您IConfiguration在服务中请求时,KeyVault 机密将可用并根据您的重新加载间隔进行刷新。


小智 7

与 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)
    }
);
Run Code Online (Sandbox Code Playgroud)

以及源代码的链接,以查看它的实际工作原理:)


Joe*_*Cai 3

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

Configuration.Reload();
Run Code Online (Sandbox Code Playgroud)

欲了解更多详情,您可以参考这篇文章