如何在Azure虚拟机上的.NET Core Web API中访问Azure Key Vault密钥
解决Azure Ubuntu虚拟机上.NET Core Web API访问Key Vault的无凭据认证问题
核心方案:使用Azure虚拟机的系统托管标识
系统托管标识由Azure自动管理,无需手动配置或存储任何租户ID、客户端ID、密钥,完全符合你的要求。
步骤1:为Ubuntu虚拟机启用系统托管标识
- 登录Azure门户,找到目标Ubuntu虚拟机
- 进入「标识」选项卡,切换到「系统分配」标签页
- 将「状态」切换为「启用」,点击「保存」确认
步骤2:为托管标识分配Key Vault访问权限
- 打开你的Key Vault资源,进入「访问策略」选项卡
- 点击「添加访问策略」:
- 在「密钥权限」中勾选你需要的权限(比如「获取」「列表」,根据API实际需求调整)
- 在「主体」搜索框中输入你的虚拟机名称,选中对应的系统托管标识
- 点击「添加」,再点击「保存」完成策略配置
步骤3:确认.NET Core代码无需修改
你本地使用的DefaultAzureCredential已经支持自动识别Azure环境中的托管标识,代码保持不变即可:
using Azure.Security.KeyVault.Secrets; using Azure.Identity; // 初始化SecretClient var kvUri = new Uri("https://<你的KeyVault名称>.vault.azure.net/"); var secretClient = new SecretClient(kvUri, new DefaultAzureCredential()); // 读取密钥示例 var secret = await secretClient.GetSecretAsync("<你的密钥名称>"); var secretValue = secret.Value.Value;
注意:不要在appsettings.json中添加任何TenantId、ClientId、ClientSecret相关配置,
DefaultAzureCredential会自动按优先级尝试托管标识认证。
步骤4:Ubuntu虚拟机上的部署与验证
- 将编译好的.NET Core Web API发布包部署到Ubuntu虚拟机(可使用scp、Git或CI/CD工具)
- 确保Ubuntu已安装对应版本的.NET Runtime(执行
dotnet --version确认) - 配置API以服务方式运行(例如使用systemd),无需额外配置环境变量或凭据
- 启动API后,验证是否能正常读取Key Vault密钥
常见故障排查
- 权限问题:检查Key Vault访问策略中是否正确添加了VM的系统托管标识,权限是否匹配
- 网络问题:如果Key Vault设置了防火墙规则,需允许虚拟机所在的VNet或公网IP访问
- 日志排查:在API日志中查看
DefaultAzureCredential的认证流程,确认是否尝试了ManagedIdentityCredential并成功获取令牌
内容的提问来源于stack exchange,提问作者Pearl
相关产品推荐
相关产品推荐

