Uso de Adal para acceder a Azure KeyVault en nombre de un usuario

Lo siguiente está en una aplicación de consola y ClientID, RedirectUri es de la aplicación nativa creada en el directorio activo azul.

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

Ahora tengo el token para hablar con la API de administración.

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

 }

Lo anterior funciona pero requiere que cree una aplicación separada en mi AD que pueda hablar con el keyvault. Me gustaría usar mi propia ID para hablar con keyvault, pero no puedo entender cómo obtener el token de acceso que requiere el cliente keyvault.

¿Necesito actualizar el manifiesto en azure manuel y agregar que mi aplicación de consola puede obtener un token en nombre de los usuarios para keyvault? Qué código se necesita cambiar en GetAccessTokenAsync para que funcione.

He intentado darle solo los tokens de acceso o id de la solicitud de token inicial desde el punto final común. ¿Alguien tiene alguna sugerencia sobre cómo hablar con el almacén de claves azul en nombre de mi propia identificación y no de una aplicación?

Actualizar

Entonces, mirando los encabezados, descubrí que a mi token le faltaba vault.azure.net como recurso y, por lo tanto, intenté:

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

da el siguiente error:

AADSTS65005: la aplicación cliente ha solicitado acceso al recurso 'https://vault.azure.net'. Esta solicitud ha fallado porque el cliente no ha especificado este recurso en su lista requiredResourceAccess.

y mirando el manifiesto actual:

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

¿Cómo sé qué guías usar para el alcance y resourceAppId para el keyvault?

Solución temporal

Hasta que sepa cómo obtener el resourceAppId y la información relacionada, estoy usando el viejo truco de hacerse pasar por las herramientas de 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();

fuente:http://www.s-innovations.net/Blog/2014/02/12/Controlling-the-login-flow-when-using-ADAL-for-WAML Lea también el comentario de @bradygaster en la publicación del blog antes de usar el ClientID de PowerShell.

Respuestas a la pregunta(2)

Su respuesta a la pregunta