通过JavaScript调用的Azure Active Directory保护WebApi

Lui*_*MVP 5 sharepoint office365 asp.net-identity azure-active-directory asp.net-web-api2

我有以下情况:

1.-我想使用Azure AD保护Azure中的一个Web api项目(我不介意令牌,cookie,无论如何,只要它满足整个方案)

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

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

遵循一些MS Azure AD示例和Vittorio Bertocci的一些博客之后,我可以使用OWIN和Oppen ID connect正常工作第1点和第2点。但是,似乎无法实现第3点。由于我位于SharePoint Online中的页面中,因此只能使用javascript,而不能使用任何服务器端代码。我想为当前用户获取一个有效的令牌,该令牌已经在SP中登录,并且请记住,SP使用与Web api网站相同的Azure AD。是否可以仅从客户端代码调用Azure AD并获取有效令牌?

我愿意接受任何可能的解决方案。我可以在Web api项目中做任何事情。如果您正在考虑使用带有appPart的SharePoint应用程序,并且appPart从服务器端代码调用Web api,则我同意这会起作用,但是此选项目前不可用:(

非常感谢。

Mas*_*ota 2

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

在 SharePoint 框架中使用受 Azure AD 保护的企业 API


据说,Vittorio、Kirk 及其团队同时所做的工作,以及将其扩展到提供了出色样本的 Andrew,真是太棒了;这并没有真正完全回答原来的问题,因为要求之一是不要将该组件作为加载项部分运行。

如果您尝试使用直接在 SP 页面中托管的 ADAL JS(启动其自己的 OAuth 流程),这是行不通的,或者无论如何您都可以预期用户会出现奇怪的行为(因为浏览器上发生客户端重定向) 。

Peter Karpinski 提出的解决方案很有趣,并且可以满足原始问题中的要求,但需要相当大的复杂性和额外的管理/资源。

最近的这篇文章提供了一种与 Peter 类似的替代解决方案,但需要更少的“额外”并且更简单,还重用了用户的 SP 身份。
使用 JavaScript 和 Office 365 身份从 SharePoint Online 使用 Azure 托管 Web API
,既不需要在客户端使用 ADAL,也不需要在服务器端实施自定义安全提供程序/令牌颁发者。身份(cookie)将通过双方正确处理 CORS(文档)来传递。

然而,正如您在我对该博客的评论中所读到的那样,由于其安全区域的实现,这在 IE 上无法正常工作。您必须确保您可以控制客户端上的 IE 安全区域,或者拥有专门针对 IE 的替代解决方案。