You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:12:15