WebApi由Azure Active Directory保护,由JavaScript调用

时间:2014-07-07 20:27:55

标签: sharepoint asp.net-identity asp.net-web-api2 office365 azure-active-directory

我有以下情况:

1.- Azure中的web api项目,我想使用Azure AD保护(我不介意令牌,cookie,无论如何,只要它符合整个场景)

2.- asp.net MVC中的Azure网站,也由Azure AD保护。该网站必须使用SSO调用web api控制器(我在整个场景中使用相同的Azure AD)

3.-在SharePoint Online中的页面中运行的某些JavaScript代码,也以任何安全的方式调用Web api控制器(Office 365租户也使用相同的Azure AD)。如果您不了解SharePoint,请说我有一个SPA项目,我只能使用Javascript和html(没有服务器端代码)。

根据一些MS Azure AD示例和来自Vittorio Bertocci的一些博客,我能够使用OWIN和Oppen ID连接正常工作点1和2。但是,似乎无法实现第3点。由于我在SharePoint Online中的页面内部,我只能使用javascript,而不能使用任何服务器端代码。我想获取已登录SP的当前用户的有效令牌,并记住SP使用与Web api站点相同的Azure AD。 我是否可以通过客户端代码调用Azure AD并获取有效令牌?

我对任何可能的解决方案持开放态度。我可以在web api项目中做任何事情。如果您正在考虑使用appPart的SharePoint应用程序,并且appPart从服务器端代码调用web api,我同意这将起作用,但它是目前不允许的选项:(

非常感谢。

6 个答案:

答案 0 :(得分:4)

我有类似的需求。在等待微软赞助的解决方案时,我们正在研究以下方法。

您的解决方案中的

3)(即包含JavaScript的HTML页面,托管在SharePoint Online并在浏览器中运行)将调用1)中的服务(即Azure中的Web Api服务层)。 / p>

在我们的案例中,我们只想验证来自SharePoint Online(通过用户浏览器,即JavaScript)的调用来自我们租户中的正确Office 365 / SharePoint Online用户。 我们选择不使用App Model,因为我们只想在Intranet中使用一些简单的HTML / JavaScript页面,而不想要App Web。 Web Api服务器端代码是我们背后的“Web部件”代码。

在尝试解决方案并使用可操作的代码后更改为解决方案:

auth cookie是ReadOnly,无法使用。相反,我们在服务层中将一个metod注册为SharePoint Online中的App(通过appregnew.aspx)。方法url(例如https://cloudservice.customer.com/api/authentication/token)在应用清单中注册为应用开始页面,并部署到网站集合。

现在我们可以通过https://customer.sharepoint.com/sites/devassets/_layouts/15/appredirect.aspx?instance_id= {GUID}调用我们的应用程序jQuery ajax调用并解析结果。 AppRedirect发送我们在服务端点(即应用程序启动页面)中使用的正确SPAuthToken,以回调SharePoint并检查context.Web.CurrentUser。然后用户电子邮件存储在表存储中,生成的令牌将发送回调用者(即jQuery ajax调用app重定向)。

然后,该令牌将用于所有其他服务层调用,以确保谁在调用我们的服务层,并在某些情况下在我们的服务层中执行授权。

注意:您可以使用相同的方法在客户端中存储Refresh和AccessToken,并在客户端对服务的所有调用中提供该方法,并使用这些令牌将应用程序调用回SharePoint。这样可以使用Azure服务层中的用户上下文在SharePoint主机Web和服务器代码中启用HTML UI。

答案 1 :(得分:3)

为了跟进,最近发布了ADAL.js,并且最近添加了将CORS与O365 API结合使用的功能,使脚本客户端能够与受Azure AD保护的服务(例如Web API)进行通信。 / p>

http://www.andrewconnell.com/blog/adal-js-cors-with-o365-apis-files-sharepoint

答案 2 :(得分:2)

更新2018年: 现在,SharePoint Online和SPFx开发模型支持此功能,并正式记录在此处,例如此处

Consume enterprise APIs secured with Azure AD in SharePoint Framework

据说Vittorio,Kirk和他们的团队同时完成了这项工作,但同时也将其扩展到提供了大量样品的Andrew,这真是太棒了。这并不能完全回复原始问题,因为其中一个要求是不要将组件作为加载项运行。

如果您尝试使用直接在SP页面中托管的ADAL JS(它启动自己的OAuth流程),那将无法正常工作,或者无论如何您可能会对用户产生奇怪的行为(原因)客户端重定向发生在浏览器上。)

Peter Karpinski提出的解决方案很有意思,并且可以与原始问题中的要求相匹配,但需要相当复杂和额外的管理/资源。

这篇最近的文章提供了一种类似于彼得的替代解决方案,但需要更少的额外费用。并且更简单,也重复使用用户的SP身份 Consuming Azure Hosted Web API from SharePoint Online using JavaScript and Office 365 identities
 并且不要求在客户端使用ADAL,也不要求在服务器端使用自定义安全提供程序/令牌颁发者。 身份(cookie)将通过正确处理双方的CORS(documentation)来传递。

但是,正如您可以在我对该博客的评论中看到的那样,由于其安全区域实施,因此无法正常使用IE。您必须确保您可以控制客户端上的IE安全区域,或者具有针对IE的替代解决方案。

答案 3 :(得分:1)

截至今天,AAD不支持OAuth2隐式流(或OpenId Connect变体),因此您无法使用用户代理(浏览器)从AAD获取令牌,无论您是否触及了手工制作协议或使用库。 但请关注未来的公告,因为这对我们来说是一个重要的场景! HTH 欢呼声,

更新我们现在支持服务器上的隐式流程,并且我们发布了一个库来帮助您使用新功能:http://www.cloudidentity.com/blog/2015/02/19/introducing-adal-js-v1/ 谢谢你耐心等待!

答案 4 :(得分:0)

你说你只能使用HTML / JS让我觉得你有一个SharePoint托管的应用程序。

Azure AD身份验证库(ADAL)目前尚未提供对HTML5的支持。 我一直在寻找一段时间(差不多一年)如何实现你所说的;但我找不到任何有效的解决方案,但也没有使用某些“代码隐藏”。

我建议您转移到提供商托管的应用程序,在那里您将能够拥有一些C#代码,并使用ADAL来检索和重用OAuth令牌。 另外,我认为值得看一下这个文档页面:

Choose patterns for developing and hosting your app for SharePoint

Match your hosting pattern with your development goals部分

答案 5 :(得分:0)

感谢您的帮助。

嗯,它不是SP托管应用程序,但它的情况相同。它只是SP Online中的一个SP页面,因此我只能像在SP托管的应用程序中一样使用JS代码。

正如我在我的问题中所说,我同意提供商托管应用程序可能是正确的(或至少是唯一的)解决方案,但这意味着构建和应用,部署它,并手动将appPart添加到页面(在WSP中包装并不容易。所以,当您只想进行一些AJAX调用并显示一些数据时,这个解决方案非常困难。

然而,在我看到所有这些之后,我认为我们无法做任何其他事情。我还要再等几天,看看是否有人知道任何可行的奇怪工作方式,如果没有,我会将你的答案标记为有效。

再次感谢!