【问题标题】:Azure Key Vault Rest API Get Key 401Azure Key Vault Rest API 获取密钥 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,我是否可能需要对其他资源进行身份验证?

【问题讨论】:

    标签: api azure azure-api-management azure-keyvault


    【解决方案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 是类属性。

    【讨论】: