无法在Azure中使用系统分配的托管身份读取Azure Key Vault秘密值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在Azure中使用系统分配的托管身份读取Azure Key Vault秘密值相关的知识,希望对你有一定的参考价值。
遵循的步骤:
- 使用启用的身份创建新的VM(已分配系统)
- 使用存储帐户中的角色分配在IAM中添加了VM
- 能够使用C#生成令牌
- 对于现有VM,获取托管身份服务。
- [使用-az keyvault set-policy --name“” --object-id“” --secret-permissions获得权限分配访问天蓝色KV的权限列表
- 现在从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 进行身份验证