Azure Key Vault Rest API 获取密钥 401
Posted
技术标签:
【中文标题】Azure Key Vault Rest API 获取密钥 401【英文标题】:Azure Key Vault Rest API Get Key 401 【发布时间】:2019-01-02 13:58:11 【问题描述】:我正在尝试利用 Azure Key Vault REST API。我写了一小段代码来尝试获取密钥:
private static async Task<object> GetKey(string uri, string token)
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
HttpResponseMessage resp = await client.GetAsync(uri);
return resp.Content.ReadAsStringAsync().Result;
我用
来称呼它var test = GetKey(
@"https://<myVault>.vault.azure.net/keys/Test/1?api-version=2016-10-01",
token
);
其中“Test”是 .我相信我的访问令牌是正确的,因为我能够获得 Azure 中的 Vault 列表。我不确定出了什么问题。
我在 Azure 中的 API 注册拥有对 Key Vault 的完全访问权限,并且在 AAD 中被列为所有者。密钥库在所有网络上都列出,甚至是公共网络。有趣的是,如果我在 azure 文档中使用具有相同参数的 "try it" feature,我会收到 404 响应,我认为这可能是问题的一部分?
由于这不是管理 API,我是否可能需要对其他资源进行身份验证?
【问题讨论】:
【参考方案1】:错误源于我提出的最后一个问题。 Azure Key Vault 的 Rest API 的资源是 https://vault.azure.net/,而我使用的是 https://management.azure.com/。但是,使用对这个 URL 的直接 HTTP 请求并没有提供给我正确访问权限的令牌。我最终使用 SDK 与 Azure Key Vault 进行通信,即:
private async Task<string> GetAccessTokenAsync(string authority, string resource, string scope)
var appCredentials = new ClientCredential(applicationId, clientSecret);
var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
var result = await context.AcquireTokenAsync(resource, appCredentials);
return result.AccessToken;
从 SDK 方法调用它的位置为:
public async Task<string> GetKeyAsync(string vaultUrl, string vaultKey)
var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetAccessTokenAsync), new HttpClient());
var secret = await client.GetKeyAsync(vaultUrl, vaultKey);
return secret.Key.ToString();
由
从 main 调用string res = (new Program()).GetSecretAsync("https://<myVault>.vault.azure.net/", keyName).Result;
还要注意,clientSecret 和 applicationId 是类属性。
【讨论】:
以上是关于Azure Key Vault Rest API 获取密钥 401的主要内容,如果未能解决你的问题,请参考以下文章
Azure Key Vault 使用Azure Portal创建和查看Azure Key Vault
Azure DevOps -> Pipelines -> Library -> 访问 Azure Key Vault -> Key Vault 不允许从所有网络访问