.NET Framework 4.5应用如何通过REST API集成Azure Key Vault?
.NET Framework 4.5 集成 Azure Key Vault REST API 问题解答
关于IP地址169.254.169.254的说明
- 这个IP是**Azure实例元数据服务(IMDS)**的固定内部地址,仅能在Azure虚拟机内部访问,专门用于获取VM的元数据、托管身份令牌等核心资源。
- 可以直接在Azure VM部署的应用源代码中使用,但本地虚拟机无法访问该地址,本地环境需要改用服务主体密钥等其他身份认证方式。
.NET Framework 4.5 通过REST API访问Azure Key Vault的实现步骤
1. 获取身份认证令牌
Azure VM环境(基于托管身份)
在Azure VM内部,调用IMDS接口获取访问Key Vault的令牌:
using System; using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json; public async Task<string> GetVmManagedIdentityToken() { // 强制启用TLS 1.2,适配Key Vault的安全要求 System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; var client = new HttpClient(); client.DefaultRequestHeaders.Add("Metadata", "true"); var response = await client.GetAsync("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net"); response.EnsureSuccessStatusCode(); var tokenJson = await response.Content.ReadAsStringAsync(); var tokenData = JsonConvert.DeserializeObject<dynamic>(tokenJson); return tokenData.access_token; }
本地虚拟机环境(基于服务主体)
需提前创建Azure服务主体,获取租户ID、客户端ID、客户端密钥后,调用Azure AD令牌接口:
using System; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json; public async Task<string> GetServicePrincipalToken(string tenantId, string clientId, string clientSecret) { System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; var client = new HttpClient(); var requestContent = new FormUrlEncodedContent(new Dictionary<string, string> { ["grant_type"] = "client_credentials", ["client_id"] = clientId, ["client_secret"] = clientSecret, ["resource"] = "https://vault.azure.net" }); var response = await client.PostAsync($"https://login.microsoftonline.com/{tenantId}/oauth2/token", requestContent); response.EnsureSuccessStatusCode(); var tokenJson = await response.Content.ReadAsStringAsync(); var tokenData = JsonConvert.DeserializeObject<dynamic>(tokenJson); return tokenData.access_token; }
2. 调用Key Vault REST API获取资源
拿到令牌后,即可调用Key Vault接口获取机密或密钥:
获取机密示例
public async Task<string> GetKeyVaultSecret(string vaultUrl, string secretName, string accessToken) { System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken}"); var response = await client.GetAsync($"{vaultUrl}/secrets/{secretName}?api-version=7.4"); response.EnsureSuccessStatusCode(); var secretJson = await response.Content.ReadAsStringAsync(); var secretData = JsonConvert.DeserializeObject<dynamic>(secretJson); return secretData.value; }
关键注意事项
- Azure VM的托管身份必须被授予Key Vault的对应权限(如"密钥保管机秘密用户"角色)。
- 本地环境的服务主体同样需要在Key Vault中配置访问权限。
- .NET Framework 4.5默认可能未启用TLS 1.2,必须手动设置,否则会被Key Vault拒绝连接。
内容的提问来源于stack exchange,提问作者AskMe
相关产品推荐
相关产品推荐

