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 Key Vault 轮换机密

Azure DevOps -> Pipelines -> Library -> 访问 Azure Key Vault -> Key Vault 不允许从所有网络访问

Azure Key Vault 机密查询

Angular - Azure Key Vault 管理 Vault 访问机密

Azure Key Vault门户未显示秘密