Использование Adal для доступа к Azure KeyVault от имени пользователя

Ниже в консольном приложении и ClientID RedirectUri находится из созданного собственного приложения в активном каталоге azure.

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. Я хотел бы использовать свой собственный ID, чтобы поговорить с keyvault, но я не могу понять, как получить токен доступа, который требуется клиенту keyvault.

Нужно ли обновлять манифест на лазурном мануэле и добавлять, что моему консольному приложению разрешено получать токен от имени пользователей к keyvault? Какой код необходимо изменить в GetAccessTokenAsync, чтобы он работал.

Я попытался дать ему только токены доступа или id из первоначального запроса на токен из общей конечной точки. Есть ли у кого-нибудь какие-то предложения о том, как разговаривать с azure key vault от имени моего собственного идентификатора, а не приложения?

Update

Таким образом, глядя на заголовки, я обнаружил, что мой токен пропускает vault.azure.net как ресурс и поэтому пытается:

var testtoken = authContext.AcquireToken("https://vault.azure.net", ClientID, RedirectUri);

дает следующую ошибку:

AADSTS65005: клиентское приложение запросило доступ к ресурсу 'https://vault.azure.net'. Этот запрос не удался, потому что клиент не указал этот ресурс в своем списке требуемых ресурсовResourceAccess.

и глядя на текущий манифест:

"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?

Temp Solution

Пока я не знаю, как получить ресурсAppId и связанную информацию, я использую старый трюк, выдающий инструменты 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 clientid.

Ответ 1

Ты на правильном пути! Вам необходимо настроить AAD, чтобы иметь возможность авторизовать пользователей специально для доступа к KeyVault. Попробуйте добавить к манифесту следующее.

{
      "resourceAppId": "cfa8b339-82a2-471a-a3c9-0fc0be7a4093",
      "resourceAccess": [
        {
          "id": "f53da476-18e3-4152-8e01-aec403e6edc0",
          "type": "Scope"
        }
      ]
}

Если это не сработает, вы можете сделать это старомодным способом, посетив старый портал, перейдя в AAD, ваш AAD Tenant, ваше приложение и добавление "Azure Key Vault" в разделе "Разрешения на другие приложения" на вкладке "Настроить".

Ответ 2

Вот что вам нужно сделать:

  • Создание принципа обслуживания
  • Зарегистрируйте его в Azure AD
  • Предоставить доступ к API Azure KeyVault

Этапы были задокументированы в статье Azure в сентябре прошлого года в

https://blogs.technet.microsoft.com/kv/2016/09/17/accessing-key-vault-from-a-native-application/

В этой статье объясняется, как выполнить описанные выше шаги для доступа к Azure KeyVault программным путем из собственного приложения (в отличие от приложения-службы), не полагаясь на трюк Azure Powershell, упомянутый в @benv.