Azure Key Vault Rest API 获取密钥 401

Azure Key Vault Rest API Get Key 401

我正在尝试利用 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 中列为所有者。 Key Vault 列在所有网络上,甚至 public。有趣的是,如果我在 azure 文档中使用具有相同参数的 "try it" feature,我会收到 404 响应,我认为这可能是问题的一部分?

我是否需要对不同的资源进行身份验证,因为这不是管理 API?

错误源于我提出的最后一个问题。 Azure Key Vault 的 Rest API 的资源是 https://vault.azure.net/ whereas I was using 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 是 class 属性。