我正在尝试利用Azure密钥库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文档中使用具有相同参数的"尝试"功能,我会得到404响应,我认为这可能是问题的一部分?
由于这不是一个管理API,我是否可能需要对不同的资源进行身份验证?
错误源于我提出的最后一个问题。Azure密钥保管库的Rest API的资源为https://vault.azure.net/而我使用https://management.azure.com/.然而,使用对该URL的直接HTTP请求并没有提供一个令牌来给我正确的访问权限。我最终使用SDK与Azure密钥库进行通信,即:
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();
}
从主目录调用
string res = (new Program()).GetSecretAsync("https://<myVault>.vault.azure.net/", keyName).Result;
还要注意,clientSecret和applicationId是类属性。