2017-07-21 3 views
1

J'ai créé une application Azure AAD de type webapp qui a le secret client et l'URL de redirection. Maintenant, je veux obtenir un jeton d'accès au nom de l'utilisateur en utilisant l'application AAD. En regardant la documentation, j'ai obtenu le code suivant jusqu'à présent.Comment obtenir un jeton On-Be-Of-User dans .NET en utilisant ADAL

static void Main(string[] args) 
    { 
     var clientId = "<REDACTED>"; 
     var clientSecret = "<REDACTED>"; 
     var resourceAppIdURI = "https://api.office.com/discovery/"; 
     var authority = "https://login.microsoftonline.com/common"; 

     AuthenticationContext ac = new AuthenticationContext(authority, new FileCache()); 
     ClientCredential cc = new ClientCredential(clientId, clientSecret); 

     // Get token as application 
     var task = ac.AcquireTokenAsync(resourceAppIdURI, cc); 
     task.Wait(); 
     var appToken = task.Result.AccessToken; 

     // Get tokenn on behalf of user 
     UserCredential uc = new UserCredential("[email protected]"); 
     task = ac.AcquireTokenAsync(resourceAppIdURI, clientId, uc); 
     var userToken = task.Result.AccessToken; 

     Console.ReadLine(); 
    } 

Mais c'est l'erreur que j'obtiens lorsque j'essaie d'obtenir un jeton utilisateur comme suit.

message « AADSTS70002: Le corps de la requête doit contenir le paramètre suivant:. 'Client_secret ou client_assertion \ r \ nTrace ID: 0e977f67-d5cb-4cf5-8fea-bac04b6d0400 \ r \ nCorrelation ID: 824a96bf -8007-4879-970c-2680644b8669 \ r \ nTimestamp: 21/07/2017 05: 02: 41Z » ​​string

Pourquoi ai-je cette erreur et comment y remédier? Dois-je d'abord me connecter avec l'utilisateur, puis utiliser UserAssertion? Il existe des tonnes de méthodes surchargées pour la méthode AcquireTokenAsync, mais je ne sais pas exactement ce que je devrais utiliser.

J'ai aussi regardé cette url github pour voir comment ils le font https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof/blob/8afb3e6a648d8e7246685bf6747d009006c761b8/TodoListService/Controllers/TodoListController.cs

Ceci est le code approprié pour obtenir jeton utilisateur connecté

ClientCredential clientCred = new ClientCredential(clientId, appKey); 
    var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext; 
    string userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value; 
    string userAccessToken = bootstrapContext.Token; 
    UserAssertion userAssertion = new UserAssertion(bootstrapContext.Token, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName); 

    string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant); 
    string userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value; 
    AuthenticationContext authContext = new AuthenticationContext(authority, new DbTokenCache(userId)); 

Ici, ils ont déjà connecté utilisateur et en créant une UserAssertion à partir du jeton de cet utilisateur connecté. Dans mon application de console, l'utilisateur ne s'est pas encore connecté. J'ai donc besoin d'un moyen de le faire dans mon application de console. Comment puis-je montrer la page de connexion AAD à l'utilisateur en tant que pop-up, puis une fois que l'utilisateur entre dans Creds utiliser cette information pour créer un objet UserAssertion?

grâce

Répondre

1

Votre scénario est une application native qui appelle une API Web au nom d'un utilisateur. L'application native pourrait obtient un jeton d'accès pour l'utilisateur en utilisant le OAuth 2.0 authorization code grant, le jeton d'accès est alors envoyé dans la demande à l'API Web, qui autorise l'utilisateur et retourne la ressource souhaitée: enter image description here

S'il vous plaît en savoir plus sur la description du flux de protocole here. Voir également le code samples pour les scénarios d'application native à l'API Web. En outre, vous pouvez cliquer sur here pour obtenir un exemple de code sur l'appel de l'API Azure AD Graph à partir d'un client natif (application de console .net). Elle utilise la bibliothèque ADAL (Active Directory Authentication Library) pour l'authentification.

+0

Je ne veux vraiment pas utiliser une autre application aad (client natif) pour obtenir au nom du jeton de l'utilisateur. Lorsque j'essaie d'obtenir un jeton d'accès à l'aide de l'application posman, et que j'apporte les informations d'identification de l'application webapp, il obtient le nom de l'utilisateur. Alors, comment puis-je faire la même chose dans mon application de console? – user330612

+0

Si vos besoins sont dans l'application console, affichez la page de connexion AAD à l'utilisateur sous forme de pop-up, et obtenez le jeton d'accès au nom de l'utilisateur, puis vous devez enregistrer une application native dans AAD. Quel est votre scénario? –

+0

Je vois. Si j'utilise PowerShell à la place de l'application Console, puis-je utiliser les mêmes informations d'identification Web App pour me connecter avec l'utilisateur qui affiche une fenêtre contextuelle ou a-t-il également besoin d'une application native. Mon scénario est que je n'ai qu'une seule application web créée et que je n'ai pas accès à aad pour créer plus d'applications et je veux tester certaines API qui nécessitent d'utiliser au nom du jeton d'accès utilisateur.L'application de la console n'est pas la bonne approche alors laissez-moi savoir quoi d'autre je peux utiliser pour tester les réponses api étant donné que je n'ai qu'une seule application web – user330612