Использование Adal для доступа к Azure KeyVault от имени пользователя
Ниже приводится описание консольного приложения и ClientID. RedirectUri из созданного собственного приложения в Azure Active Directory.
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, которое может общаться с keyvault. Я хотел бы использовать свой собственный идентификатор для общения с keyvault, но я не могу понять, как получить токен доступа, который требуется клиенту keyvault.
Нужно ли обновлять манифест на Azure Manuel и добавлять, что моему консольному приложению разрешено получать токен от имени пользователей для keyvault? Какой код необходимо изменить в GetAccessTokenAsync, чтобы он работал.
Я попытался дать ему только токены доступа или id из первоначального запроса токена от общей конечной точки. У кого-нибудь есть предложения о том, как общаться с хранилищем ключей Azure от имени моего собственного идентификатора, а не приложения?
ОбновитьПоэтому, посмотрев на заголовки, я обнаружил, что мой токен пропускает 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"
}
]
}
],
Как мне узнать, какие направляющие использовать для scope и resourceAppId для keyvault?
Временное решениеПока я не знаю, как получить 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.