如何让.NET应用在Azure中指定目标Key Vault读取密钥?
解决方案
1. 显式指定目标Key Vault
应用不会自动读取所在资源组的Key Vault,必须显式指定Vault URI。推荐通过环境配置隔离不同环境的Vault地址:
- 在
appsettings.json中保留本地开发的占位配置:{ "KeyVaultUri": "" } - 在
appsettings.Production.json(云端环境)中填入目标Key Vault的URI:{ "KeyVaultUri": "https://your-vault-name.vault.azure.net/" } - 代码中读取配置并加载Key Vault:
var vaultUri = builder.Configuration["KeyVaultUri"]; if (!string.IsNullOrEmpty(vaultUri)) { builder.Configuration.AddAzureKeyVault( new Uri(vaultUri), new DefaultAzureCredential(), new CustomSecretManager()); // 密钥映射逻辑见下文 }
这样只有云端环境会加载Key Vault,本地因为KeyVaultUri为空,不会触发网络请求。
2. 本地与云端密钥的无冲突隔离
ASP.NET Core配置系统有明确的优先级规则,本地开发时dotnet user-secrets的优先级高于Key Vault。只要你通过dotnet user-secrets set "Foot:Left" "value"设置了本地密钥,即使代码中添加了Key Vault配置,也会优先读取本地密钥,完全不依赖网络。
如果需要强制本地不加载Key Vault,也可以通过环境判断实现:
if (builder.Environment.IsProduction()) { // 仅生产环境加载Key Vault var vaultUri = builder.Configuration["KeyVaultUri"]; builder.Configuration.AddAzureKeyVault(new Uri(vaultUri), new DefaultAzureCredential(), new CustomSecretManager()); }
3. Key Vault访问策略的安全配置
云端应用(生产环境)
使用托管身份实现无密钥认证,彻底避免硬编码凭证:
- 给你的Azure应用服务(或部署资源)启用系统分配托管身份:在Azure门户的应用服务→"身份"→"系统分配"→开启。
- 进入目标Key Vault→"访问策略"→"添加访问策略":
- 权限:选择"机密"→"读取"
- 主体:搜索并选择你的应用服务的托管身份名称
- 保存配置
- 代码中使用
DefaultAzureCredential,它会自动通过托管身份完成认证,无需额外配置。
本地开发(可选,如需测试Key Vault)
如果需要本地临时读取Key Vault,用以下方式安全认证,无需硬编码密钥:
- 确保本地已登录Azure CLI(执行
az login),或在Visual Studio中登录Azure账号。 DefaultAzureCredential会自动优先使用CLI/VS的登录身份,无需额外配置。- 在Key Vault的访问策略中添加你的Azure账号(或创建专用服务主体),授予"机密读取"权限即可。
4. 密钥名称映射处理
针对本地Foot:Left对应Key VaultFoot--Left的映射需求,自定义IKeyVaultSecretManager实现格式转换:
public class CustomSecretManager : IKeyVaultSecretManager { // 加载所有Key Vault中的机密 public bool Load(SecretProperties properties) => true; // 将Key Vault的密钥名转换为本地的配置键格式 public string GetKey(KeyVaultSecret secret) { return secret.Name.Replace("--", ":"); } }
在添加Key Vault配置时传入这个管理器,就能自动完成名称映射。
内容的提问来源于stack exchange,提问作者Konrad Viltersten
相关产品推荐
相关产品推荐

