以下是在控制台应用程序和 ClientID 中,RedirectUri 来自天蓝色活动目录中创建的本机应用程序。
var authContext = new AuthenticationContext(string.Format("https://login.windows.net/{0}","common"),new FileCache());
var token = authContext.AcquireToken("https://management.core.windows.net/", ClientID, RedirectUri, PromptBehavior.Auto);
我现在有了与管理 api 交谈的令牌。
using (var client = new KeyVaultManagementClient(new TokenCloudCredentials(SubscriptionId, token.AccessToken)))
{
var a = client.Vaults.List(resourceGroup, 10);
foreach(var vault in a.Vaults)
{
var vaultInfo = client.Vaults.Get(resourceGroup, vault.Name);
Console.WriteLine(JsonConvert.SerializeObject(vaultInfo.Vault, Formatting.Indented));
//Verifying that the AccessPolicies contains my object id (pasting idtoken into jwt.io and compare with oid claim) Success.
// Now its time to talk with keyvault
var keyvault = new KeyVaultClient(GetAccessTokenAsync);
var secrets = keyvault.GetSecretsAsync(vaultInfo.Vault.Properties.VaultUri).GetAwaiter().GetResult();
}
}
private static Task<string> GetAccessTokenAsync(string authority, string resource, string scope)
{
var context = new AuthenticationContext(authority, new FileCache());
var result = context.AcquireToken(resource, new ClientCredential(AppClientId,AppKey));
return Task.FromResult(result.AccessToken);
}
以上工作,但要求我在我的 AD 上创建一个可以与密钥库对话的单独应用程序。我想使用自己的 ID 与 keyvault 交谈,但我不知道如何获取 keyvault 客户端所需的访问令牌。
我是否需要更新 azure manuel 上的清单并添加允许我的控制台应用程序代表用户获取 keyvault 的令牌?需要在 GetAccessTokenAsync 中更改哪些代码才能使其工作。
我已经尝试只给它来自公共端点的初始令牌请求的访问或 ID 令牌。有人对如何代表我自己的 id 而不是应用程序与 azure key vault 交谈有什么建议吗?
更新
因此,查看标头我发现我的令牌缺少 vault.azure.net 作为资源,因此尝试:
var testtoken = authContext.AcquireToken("https://vault.azure.net", ClientID, RedirectUri);
给出以下错误:
AADSTS65005:客户端应用程序已请求访问资源“ https://vault.azure.net ”。此请求失败,因为客户端未在其 requiredResourceAccess 列表中指定此资源。
并查看当前清单:
"requiredResourceAccess": [
{
"resourceAppId": "797f4846-ba00-4fd7-ba43-dac1f8f63013",
"resourceAccess": [
{
"id": "41094075-9dad-400e-a0bd-54e686782033",
"type": "Scope"
}
]
},
{
"resourceAppId": "00000002-0000-0000-c000-000000000000",
"resourceAccess": [
{
"id": "311a71cc-e848-46a1-bdf8-97ff7156d8e6",
"type": "Scope"
}
]
}
],
我怎么知道 keyvault 的范围和 resourceAppId 使用哪些 guid?
临时解决方案
在我知道如何获取 resourceAppId 和相关信息之前,我一直在使用模拟 powershell 工具的旧技巧。
var vaultToken = authContext.AcquireToken("https://vault.azure.net", "1950a258-227b-4e31-a9cf-717495945fc2", new Uri("urn:ietf:wg:oauth:2.0:oob"));
var keyvault = new KeyVaultClient((_, b, c) => Task.FromResult(vaultToken.AccessToken));
var secrets = keyvault.GetSecretsAsync(vaultInfo.Vault.Properties.VaultUri).GetAwaiter().GetResult();
来源:http : //www.s-innovations.net/Blog/2014/02/12/Controlling-the-login-flow-when-using-ADAL-for-WAML 请在之前的博客文章中阅读@bradygaster 评论使用 powershells 客户端 ID。