Azure Key Vault Rest API获取密钥401

时间:2018-07-25 16:55:57

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

我正在尝试利用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中的保管库的列表。我不确定发生了什么问题。

我在Azure中的API注册具有对密钥保险库的完全访问权限,并在AAD中被列为所有者。密钥库已在所有网络上列出,甚至是公共网络。不过,有趣的是,如果我在azure文档中使用具有相同参数的"try it" feature,则会收到404响应,我相信这可能是问题的一部分?

由于这不是管理API,是否可能需要对其他资源进行身份验证?

1 个答案:

答案 0 :(得分:0)

该错误源于我提出的最后一个问题。 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是类属性。