无法在Azure中使用系统分配的托管身份读取Azure Key Vault秘密值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在Azure中使用系统分配的托管身份读取Azure Key Vault秘密值相关的知识,希望对你有一定的参考价值。

遵循的步骤:

  1. 使用启用的身份创建新的VM(已分配系统)
  2. 使用存储帐户中的角色分配在IAM中添加了VM
  3. 能够使用C#生成令牌
  4. 对于现有VM,获取托管身份服务。
  5. [使用-az keyvault set-policy --name“” --object-id“” --secret-permissions获得权限分配访问天蓝色KV的权限列表
  6. 现在从VM执行代码时出现错误

我能够从GetToken()方法获取令牌,但出现此错误:

Unhandled exception. System.Net.WebException: The remote server returned an error: (401) Unauthorized.
   at System.Net.HttpWebRequest.GetResponse()
   at KeyFromAzKeyVault.Program.FatchSecretKeyFromKeyVault(String token) 

CODE:

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;
            }
        }
    }
}
答案

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

更改WebRequest request = WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net/");

WebRequest request = WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net");

[当我对此进行测试时,我收到以下JSON错误响应,试图连接到Key Vault,因此如果以上操作无效,请捕获WebException并检查其Response属性,以查看是否还有其他详细信息。] >

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

以上是关于无法在Azure中使用系统分配的托管身份读取Azure Key Vault秘密值的主要内容,如果未能解决你的问题,请参考以下文章

具有托管标识(用户分配)的 Azure SQL 无法针对 AAD 使用

需要通过oledb连接从azure存储blob容器中读取excel文件

在 Azure Batch 中使用托管标识在批处理池中使用 Python 对 Key Vault 进行身份验证

如何获取Azure App Service的特定用户分配的托管服务标识的令牌?

无法将事件网格系统分配的托管标识添加到存储帐户角色

为啥我的 Azure 应用服务无法使用托管标识连接到 Azure 存储帐户?