2016-03-04 4 views
4

J'ai une application angulaire qui parle à l'WebAPI et les utilisateurs sont authentifiés contre Azure Active DirectoryComment accéder à l'API graphique de l'API Web dans l'application SPA

J'ai suivi l'échantillon ici https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp-dotnet-webapi et a été en mesure d'authentifier l'utilisateur contre AD et transmettre cela à l'API Web.

Cependant, je veux accéder à l'API graphique dans l'API Web et obtenir les informations de profil utilisateur en cours. Comment puis-je le configurer?

Mise à jour pour donner plus de contexte sur la configuration:

J'ai un site Web (site.domain1.com) qui héberge html et les fichiers javascript qui rend une application SPA. J'ai une API Web hébergée sur api.domain2.com. L'authentification est contre Azure AD utilisant le flux implicite OAuth avec ADAL.js et angular-adal. Je veux m'authentifier dans SPA pour obtenir l'accessToken pour l'API. Et je veux dans l'API comme la partie de la demande de requête API Graph pour obtenir plus d'informations sur l'utilisateur connecté.

Je suis en mesure d'obtenir le accessToken pour l'API et il produit le principal de réclamations actuellement. Le problème consiste à interroger l'API graphique avec l'identité actuelle que j'ai dans l'API Web.

Mise à jour:

Je ne veux pas donner des privilèges d'administrateur à l'API Web mais je veux plutôt de transmettre le consentement de l'utilisateur pour que le « Lire le profil de l'utilisateur » du navigateur sur le site Web et l'api web.

I utilisé approche similaire à au nom de l'échantillon situé ici https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof

le problème que cela a fonctionné pour mon AD test et ne fonctionne pas pour les AD de production. Dire que l'utilisateur doit concent l'App avant d'utiliser le Graph Api. (Pour la production AD I seulement l'utilisateur pouvait ajouter des privilèges d'utilisateur mais pas les privilèges d'application. Ma conjecture est que pour que ce schéma fonctionne, j'ai eu besoin de Global Admin de l'AD pour commencer. Finalement, j'ai fini par fusionner les applications Azure AD pour Web Site et l'API Web et cela a fonctionné avec la même approche On Behalf Of avec les Tokens Bootstrap. Mais je veux savoir comment le faire fonctionner correctement avec 2 applications.

+0

Avez-vous vu la exemple: https: //github.com/Azure-Samples/active-directory-angularjs-singlepageapp-dotnet-webapi/tree/graph-cors –

+0

Oui, je l'ai fait. Merci pour le lien. La différence est que dans cet exemple, ils accèdent à l'API Graph à partir de JavaScript, mais je veux le faire à partir de l'API Web. Cela fonctionne aussi bien pour moi si j'accède à l'API graphique à partir du JavaScript, mais je veux le faire à partir de l'API Web. –

+0

Ok, je vois. Je vous fournis des échantillons, j'espère qu'ils pourront vous aider. –

Répondre

0

Veuillez voir l'exemple: https://github.com/Azure-Samples/active-directory-dotnet-graphapi-web. Il y a un code pour accéder à l'API graphique et obtenir le profil de l'utilisateur dans l'échantillon:

ClientCredential credential = new ClientCredential(clientId, appKey); 
    AuthenticationResult result = null; 
    AuthenticationResult result = authContext.AcquireTokenSilent(graphResourceId, credential, 
            new UserIdentifier(userObjectID, UserIdentifierType.UniqueId)); 
         // Call the Graph API manually and retrieve the user's profile. 
           string requestUrl = String.Format(
            CultureInfo.InvariantCulture, 
            graphUserUrl, 
            HttpUtility.UrlEncode(tenantId)); 
    HttpClient client = new HttpClient(); 
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUrl); 
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); 
    HttpResponseMessage response = await client.SendAsync(request); 
     // Return the user's profile in the view. 
         if (response.IsSuccessStatusCode) 
         { 
          string responseString = await response.Content.ReadAsStringAsync(); 
    profile = JsonConvert.DeserializeObject<UserProfile>(responseString); 
         } 

Vous pouvez voir plus d'informations à partir d'ici: https://azure.microsoft.com/en-us/documentation/articles/active-directory-code-samples/#calling-azure-ad-graph-api

+0

Merci. Cet exemple ne couvre pas vraiment ma configuration ici. La plus grande différence est que j'ai un client JavaScript et une API Web qui sont censés être des hôtes différents, de sorte que le cookie auth ne fonctionnerait pas. Il y a probablement moyen de faire en sorte que le client Angular s'authentifie par rapport à l'API Web en utilisant OpenId Connect qui s'authentifie sur Azure AD mais il doit être basé sur Token de l'Angular à WebApi. Je vais essayer d'enquêter plus mais il ne semble pas être strainghtwardward à moi –

+0

Pourquoi déployez-vous dans différents hôtes? Je ne comprends pas votre intention complètement. Vous pourriez obtenir plus d'aide si vous fournissez plus d'informations ici. Merci. –

+0

Eh bien, si je veux que mes composants aient un cycle de déploiement séparé, je pourrais le faire. Ou l'API peut être générique et utilisée par d'autres applications SPA. –

0

Les autorisations sont configurables dans votre page de configuration App dans Azure, sélectionnez ce que vous souhaitez laisser l'accès App. En ce qui concerne la confirmation, vous avez le choix en tant qu'administrateur. Soit l'utilisateur accepte de partager des données avec votre application ou l'administrateur confirme pour tous sous un locataire.

C'est la bonne façon. Mon frontend et backend fonctionnent de cette façon.