我正在尝试利用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,是否可能需要对其他资源进行身份验证?
答案 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是类属性。