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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:30:54