2016-03-04 49 views
4

我有一个角度的应用程序,会谈到的WebAPI和用户对Azure中的Active Directory验证如何从网络API来访问图形API在SPA应用

我跟着样品这里https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp-dotnet-webapi并能够验证用户反对AD并将其传递给Web API。

但是我想访问Web API中的Graph API并获取当前的用户配置文件信息。我如何设置它?

更新给予更多的上下文的设置:

我有一个网站(site.domain1.com)托管HTML和JavaScript文件,这使得SPA的应用。我在api.domain2.com上托管了Web API。身份验证针对使用OAuth隐式流与ADAL.js和angular-adal的Azure AD。我想在SPA中进行身份验证以获取API的accessToken。我希望在API中作为请求的一部分来查询Graph API以获取有关当前用户登录的更多信息。

我能够获取API的accessToken,并且它当前会生成Claim Principal。问题是使用Web API中的当前身份查询Graph API。

更新:

我并不想给管理员权限到Web API,但我宁愿想从浏览器转发的只是“阅读用户配置文件的用户同意”的网站,并以网络API。

我用类似的方法代表样本这里位于https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof

它的工作为我的测试AD和AD生产没有工作。话说用户需要concent的应用程序的问题在使用Graph Api之前(仅适用于产品AD I)有用户可以添加用户权限,但不是应用程序权限。我的猜测是为了这个方案的工作,我需要AD的全局管理员先集中)。最终,我最终将用于Web站点和Web API的Azure AD应用程序合并在一起,并且与Bootstrap令牌的代表方法一起工作。但我想知道如何使它与2个应用程序正常工作。

+0

你有没有看到示例:https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp-dotnet-webapi/tree/graph-cors –

+0

是的,我做到了。 Thx为链接。不同之处在于,在这个例子中,他们从JavaScript访问Graph API,但我想从Web API执行此操作。它也适用于我,如果我从JavaScript访问Graph API,但我想从Web API执行此操作。 –

+0

好的,我明白了。我为你提供一些样品,希望他们能帮助你。 –

回答

0

请参阅示例:https://github.com/Azure-Samples/active-directory-dotnet-graphapi-web。 有一些代码来访问图形API,让用户配置文件样本:

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

你可以从这里看到的更多信息:https://azure.microsoft.com/en-us/documentation/articles/active-directory-code-samples/#calling-azure-ad-graph-api

+0

谢谢。这个示例并没有真正覆盖我的设置。最大的区别是我有JavaScript客户端和Web API,它们应该是不同的主机,所以Cookie认证不起作用。可能有办法让Angular客户端使用OpenId Connect对Web API进行身份验证,而OpenId Connect是针对Azure AD进行身份验证的,但它需要基于从Angular到WebApi的Token Based。我会尽力调查更多,但它并不看好我的工作 –

+0

为什么你部署在不同的主机?我无法完全理解你的意图。如果您在此提供更多信息,您可以获得更多帮助。谢谢。 –

+0

那么如果我想要我的组件有一个单独的部署周期,我可能想要这样做。或者API可以是通用的,并被其他SPA应用程序使用。 –

0

权限是在Azure的应用程式设定页面内配置的,你选择你希望让应用程序访问的内容。

至于确认你作为管理员有一个选择。无论是用户接受与您的应用程序共享数据或管理员确认承租人下的所有数据。

这是正确的方法。我的前端和后端以这种方式工作。