当前位置: 首页 > 知识库问答 >
问题:

无法使用在Azure中分配的系统托管标识读取Azure密钥存储库机密值

韦鸣
2023-03-14

接下来的步骤是:

  1. 创建了启用标识的新虚拟机(已分配系统)
  2. 使用存储帐户中的角色分配在IAM中添加虚拟机
  3. 能够使用C#生成令牌
  4. 为现有VM获取托管标识服务。
  5. 使用-az keyvault set-policy--name“”--object-id“--secret-permissions get list分配了访问azure KV的权限
  6. 现在,在执行来自VM的代码时,我得到一个错误
Unhandled exception. System.Net.WebException: The remote server returned an error: (401) Unauthorized.
   at System.Net.HttpWebRequest.GetResponse()
   at KeyFromAzKeyVault.Program.FatchSecretKeyFromKeyVault(String token) 
namespace KeyFromAzKeyVault
{
    class Program
    {
        static void Main(string[] args)
        {
            var token = GetToken();
            Console.WriteLine(token);
            Console.WriteLine("*************FatchSecretKeyFromKeyVault from KV*********************");
            string key = FatchSecretKeyFromKeyVault(token);
            System.Console.WriteLine(key);
        }

        private static string FatchSecretKeyFromKeyVault(string token)
        {
            WebRequest kvrequest = WebRequest.Create("https://testkvaz203.vault.azure.net/secrets/testsecret/65c8c3b1e56e4a2fae0b6c8033c6b9ce?api-version=7.0");
            kvrequest.Headers.Add("Authorization", "Bearer " + token);
            WebResponse response = kvrequest.GetResponse();
            return ParseWebResponse(response, "value");
        }

        private static string GetToken()
        {
            WebRequest request = WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net/");
            request.Headers.Add("Metadata", "true");
            request.Method = "GET";
            WebResponse response = request.GetResponse();
            return ParseWebResponse(response,"access_token");
        }

        private static string ParseWebResponse(WebResponse response, string tokenName)
        {
            string token = string.Empty;
            using (Stream stream = response.GetResponseStream())
            {
                StreamReader streamResponse = new StreamReader(stream, Encoding.UTF8);
                string stringResponse = streamResponse.ReadToEnd();
                JObject JoResponse = JObject.Parse(stringResponse);
                JValue Jobject = (JValue)JoResponse[tokenName];
                token = Jobject.Value.ToString();
                return token;
            }
        }
    }
}

共有1个答案

史高阳
2023-03-14

您可能需要从getToken()WebRequest中的资源查询字符串参数中删除尾随/。

更改webrequest请求=webrequest.create(“http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net/”);

webrequest请求=webrequest.create(“http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net”);

当我测试这一点时,我在尝试连接到Key Vault时得到了下面的JSON错误响应,因此如果上面的操作不起作用,则捕获WebException并检查其response属性,以查看是否有其他细节。

{
  "error": {
    "code": "Unauthorized",
    "message": "AKV10022: Invalid audience. Expected https://vault.azure.net, found: https://vault.azure.net/."
  }
}
 类似资料: