我有以下场景:
1。- Azure中的web api项目,我想使用Azure AD(我不介意令牌,cookie,无论什么,只要它满足整个场景)安全
2。-一个Azure网站在asp.net MVC,也由Azure AD保护。这个网站必须调用web api控制器与SSO(我在整个场景中使用相同的Azure AD)
3。-一些JavaScript代码在SharePoint Online的页面中运行,也以任何安全的方式调用web api控制器(Office 365租户也使用相同的Azure AD)。如果你不了解SharePoint,假设我有一个SPA项目,我只能使用Javascript和html(没有服务器端代码)。
通过一些MS Azure AD示例和Vittorio Bertocci的一些博客,我能够使用OWIN和openid连接,使第1点和第2点工作良好。然而,似乎不可能实现第3点。由于我是在SharePoint Online的页面中,所以我只能使用javascript,而不能使用任何服务器端代码。我想获得一个有效的令牌为当前用户,这是已经登录在SP,并记住SP使用相同的Azure AD的web api网站。我能否仅从客户端代码调用Azure AD并获得有效令牌?
我愿意接受任何可能的解决方案。我可以在web api项目中做任何事情。如果你想在SharePoint应用程序中使用appPart,并且appPart从服务器端代码调用web api,我同意这将起作用,但这是一个目前不允许的选项:(多谢。
我有类似的需求。在等待微软赞助的解决方案的同时,我们正在研究以下方法。
3)
在您的解决方案(即HTML页面与JavaScript,托管在SharePoint Online
和运行在浏览器)将调用服务在1)
(即在Azure的Web Api服务层)。
在我们的示例中,我们只想验证从SharePoint Online
(通过用户浏览器,即JavaScript)发出的调用来自租户中正确的Office 365
/SharePoint Online
用户。我们选择退出使用应用程序模型,因为我们只想在我们的内部网中一些简单的HTML/JavaScript页面,而不想要应用程序web。Web Api服务器端代码就是我们后面的"Web部件"代码。
在尝试并拥有可操作的代码后更改解决方案:
验证cookie是只读的,不能使用。相反,我们在我们的服务层注册了一个方法作为SharePoint Online中的App(通过appregnews .aspx)。该方法的url(例如https://cloudservice.customer.com/api/authentication/token)在应用程序清单中注册为应用程序的起始页,并部署到站点集合中。
现在我们可以通过jQuery ajax调用https://customer.sharepoint.com/sites/devassets/_layouts/15/appredirect.aspx?instance_id={GUID}调用我们的App并解析结果。AppRedirect发送正确的SPAuthToken,我们在服务端点(即应用程序开始页)中使用它回调SharePoint并检查context.Web.CurrentUser。用户的电子邮件然后存储在表存储与生成的令牌,我们发送回调用者(即jQuery ajax调用应用程序重定向)。
然后在所有其他服务层调用中使用该令牌,以确保谁在调用我们的服务层,并在某些情况下在我们的服务层中执行授权。
注意,你可以使用相同的方法在你的客户端中存储Refresh和AccessToken,并在客户端对你的服务的所有调用中提供这些令牌,并使用这些令牌来做回SharePoint的应用程序调用。这使得SharePoint主机web中的HTML UI和使用Azure服务层中的用户上下文的服务器代码成为可能。
为了跟进,ADAL.js最近已经发布,并且最近添加了使用CORS与O365 API的能力,使脚本客户端能够与Azure AD保护的服务通信,例如您的Web API。
http://www.andrewconnell.com/blog/adal-js-cors-with-o365-apis-files-sharepointUPDATE 2018:现在SharePoint Online和SPFx开发模型都支持这个功能,并且有官方文档,例如这里
在SharePoint框架中使用Azure AD安全的企业api
据说Vittorio, Kirk和他们的团队同时完成的工作,但也延伸到Andrew,他已经交付了很好的样品,是了不起的;这并没有完全回答最初的问题,因为其中一个要求是不要将组件作为外接组件运行。
如果你尝试使用ADAL JS(它会启动自己的OAuth流)直接在SP页面中托管,那是行不通的,或者无论如何你都可以预期用户的奇怪行为(导致浏览器上发生客户端重定向)。
Peter Karpinski提出的解决方案很有趣,并且可以匹配原始问题中的需求,但需要相当多的复杂性和额外的管理/资源。
这篇最近的文章提供了一个类似于Peter的解决方案的替代方案,但需要的"额外"更少,而且更简单,也重用用户的SP身份。
使用JavaScript和Office 365身份从SharePoint Online消费Azure托管Web API
并且不需要在客户端使用ADAL,也不需要在服务器端实现自定义安全提供者/令牌颁发者。标识(cookie)将通过在双方正确处理CORS(文档)来传递。
然而,正如你可以在我的评论中读到的那样,由于IE的安全区域实现,这将无法正常工作。您必须确保对客户端的IE安全区域有控制,或者有针对IE的替代解决方案。
截至目前,AAD不支持OAuth2隐式流(或OpenId Connect变体),因此您无法使用用户代理(浏览器)从AAD获得令牌,无论您是手工制作协议还是使用库。但是,请关注未来的公告,因为这对我们来说是一个重要的场景!HTH干杯,
与
update我们现在在服务器上支持隐式流,并且我们发布了一个库来帮助您使用新特性:http://www.cloudidentity.com/blog/2015/02/19/introducing-adal-js-v1/谢谢您的耐心等待!
事实上,你说你只能使用HTML/JS让我猜你有一个sharepoint托管的应用程序。
Azure AD认证库(ADAL)目前还不支持HTML5。我一直在寻找一段时间(几乎一年)如何实现你所说的东西;但我找不到任何有效的解决方案,这也不使用一些"代码隐藏"。
我建议你转移到一个提供商托管的应用程序,在那里你可以有一些c#代码,并使用ADAL来检索和重用OAuth令牌。另外,我认为值得看看这个文档页:
选择开发和托管SharePoint应用程序的模式
感谢您的帮助
好吧,它不是一个sp托管的应用程序,但它是相同的场景。这只是SP Online中的一个SP页面,所以我只能像在SP托管的应用程序中那样使用JS代码。
正如我在问题中所说的,我同意Provider托管的应用程序可能是正确的(或者至少是唯一的)解决方案,但这意味着要构建一个应用程序,部署它,并手动将appPart添加到页面中(在WSP中不容易打包)。因此,当您只想进行一些AJAX调用并显示一些数据时,此解决方案相当困难。
然而,在我看到了所有这些之后,我认为我们无能为力。我要再等几天,看看有没有人知道什么奇怪的解决办法,如果没有,我会把你的答案标记为有效。
再次感谢!