有没有办法在缓存过期之前通知 Web 应用有关密钥保管库秘密的更新

Is there a way to notify the web app about key vault secret's updates before cache expires

我在 VM 中有一个 asp.net 核心 3.1 Web 应用程序 运行,在启动期间,我正在准备每 5 分钟轮换一次的 Azure Key Vault 配置。这将从 Azure Key Vault 中提取所有机密并缓存 5 分钟。

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
            {
                config.AddAzureKeyVault(new AzureKeyVaultConfigurationOptions
                {
                    Vault = "https://testvault007.vault.azure.net/",
                    ReloadInterval = TimeSpan.FromMinutes(5),
                    Client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(new AzureServiceTokenProvider().KeyVaultTokenCallback)),
                });
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });

如果在缓存时间内,即 5 分钟内,secrets 被更新,那么有没有办法通知 Web 应用并立即重新加载它?

这是可能的,但值得吗?轮询很便宜,而监听通知很复杂。毕竟,当系统的凭据在所有客户端应用程序收到新凭据之前发生更改时,我们必须处理更长的延迟。

AKV 提供程序的代码是 available on Github,可以修改以处理通知。问题是从 AKV 向提供商发送通知。

如果有一种廉价的方式来更新缓存,就不需要 ReloadInterval。要获得通知,您的应用程序需要公开端点(普通 HTTP 端点或 webhook)或使用 websockets 连接到服务器,这在谈论云规模时并不便宜。不用说,AKV 或任何服务器或服务无法为每个客户端维护 websocket 连接。

似乎 AKV 事件是 only sent to Azure Event Grid,从 Azure 的可扩展性角度来看,这非常有意义。不过,这会使未托管在 Azure 上的 Web 应用更难收听通知。

给定事件网格后,问题是将通知发送到您的应用程序。

  • 一种方法是从您的应用和 have Event Grid post to it 公开端点。该端点必须调用您的自定义提供程序并告诉它重新加载其缓存。
  • 与此类似的是在您的应用中公开一个网络挂钩 having Event Grid post to the webhook。在这两种情况下,您都需要向 public 互联网公开端点、保护它、处理防火墙、域名等
  • 不需要端点的一个不错的选择是使用 Azure SignalR。遗憾的是,事件网格不会直接发布到 SignalR。您必须使用 Azure Functions 来接收事件,将其转发给 SignalR 并让您的自定义提供程序侦听此类通知。你避免使用本地 webhook,但现在你需要两个额外的 Azure 服务。 This article explains how to do all this

所有这些都增加了成本、复杂性以及额外的维护和监控工作。整体解决方案的可靠性会降低,因为它容易受到事件网格、Azure Functions 或 SignalR 中断的影响。

延迟 5 分钟值得吗?