.NET Core集成Azure Key Vault禁用密钥引发get操作报错如何解决
解决方案
问题根因
默认DefaultKeyVaultSecretManager不会过滤禁用状态的密钥,拿到密钥列表后会直接对所有条目调用GetSecret接口,访问禁用密钥时就会抛出权限异常。
实现步骤
1. 自定义密钥过滤管理器
继承DefaultKeyVaultSecretManager,重写Load方法,只保留启用状态的密钥:
using Microsoft.Azure.KeyVault.Models; using Microsoft.Extensions.Configuration.AzureKeyVault; public class FilteredKeyVaultSecretManager : DefaultKeyVaultSecretManager { public override bool Load(SecretItem secret) { // 仅加载已启用的密钥 return secret.Attributes?.Enabled == true && base.Load(secret); } }
2. 替换默认管理器
修改Program.cs中Key Vault注册代码,将原来的DefaultKeyVaultSecretManager替换为自定义的实现:
if (ctx.HostingEnvironment.IsProduction()) { var builtConfig = builder.Build(); var keyVaultEndpoint = $"https://{builtConfig["AppSettings:KeyVaultName"]}.vault.azure.net/"; var azureServiceTokenProvider = new AzureServiceTokenProvider(); var keyVaultClient = new KeyVaultClient( new KeyVaultClient.AuthenticationCallback( azureServiceTokenProvider.KeyVaultTokenCallback)); // 替换为自定义的过滤管理器 builder.AddAzureKeyVault(keyVaultEndpoint, keyVaultClient, new FilteredKeyVaultSecretManager()); }
说明
- 过滤逻辑直接复用List Secrets接口返回的密钥属性,不需要额外发起API请求,无额外性能开销
- 保留了
DefaultKeyVaultSecretManager的原有逻辑,比如对带--的密钥转换为配置层级的规则不会受到影响
内容的提问来源于stack exchange,提问作者V_B
相关产品推荐
相关产品推荐

