Usando o Adal para acessar o Azure KeyVault em nome de um usuário

A seguir, em um aplicativo de console e ClientID, RedirectUri é do aplicativo nativo criado no diretório ativo do 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);

Agora tenho o token para conversar com a API de gerenciamento.

 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);

 }

Acima funciona, mas exige que eu crie um aplicativo separado no meu AD que possa conversar com o keyvault. Gostaria de usar meu próprio ID para conversar com o keyvault, mas não consigo descobrir como obter o token de acesso exigido pelo cliente do keyvault.

Preciso atualizar o manifesto no azure manuel e adicionar que meu aplicativo de console tenha permissão para obter um token em nome dos usuários para o keyvault? Qual código é necessário para ser alterado no GetAccessTokenAsync para que ele funcione.

Tentei fornecer apenas os tokens de acesso ou identificação da solicitação inicial de token do terminal comum. Alguém tem algumas sugestões sobre como falar com o Azure Key Vault em nome da minha própria identificação e não de um aplicativo?

Atualizar

Então, olhando para os cabeçalhos, descobri que meu token estava faltando o vault.azure.net como recurso e, portanto, tentei:

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

dá o seguinte erro:

AADSTS65005: O aplicativo cliente solicitou acesso ao recurso 'https://vault.azure.net' Esta solicitação falhou porque o cliente não especificou este recurso em sua lista requiredResourceAccess.

e olhando para o manifesto atual:

"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"
        }
      ]
    }
  ],

Como sei quais guias usar para escopo e resourceAppId para o keyvault?

Solução Temp

Até que eu saiba como obter o resourceAppId e informações relacionadas, estou usando o velho truque de representar as ferramentas do 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();

fonte:http://www.s-innovations.net/Blog/2014/02/12/Controlling-the-login-flow-when-using-ADAL-for-WAML Leia também o comentário @bradygaster na postagem do blog antes de usar o powershells clientid.

questionAnswers(2)

yourAnswerToTheQuestion