【问题标题】:WebApi secured by Azure Active Directory called from JavaScript由 JavaScript 调用的 Azure Active Directory 保护的 WebApi
【发布时间】:2014-07-07 20:27:55
【问题描述】:

我有以下场景:

1.- Azure 中的一个 web api 项目,我想使用 Azure AD 保护它(我不介意 Token、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,我同意这将起作用,但这是目前不允许的选项 :(

非常感谢。

【问题讨论】:

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


    【解决方案1】:

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

    您的解决方案中的3)(即带有 JavaScript 的 HTML 页面,托管在 SharePoint Online 并在浏览器中运行)将调用 1) 中的服务(即 Azure 中的 Web Api 服务层)。

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

    在尝试并获得可行的代码后更改解决方案:

    身份验证 cookie 是只读的,不能使用。相反,我们在我们的服务层中将一个方法注册为 SharePoint Online 中的应用程序(通过 appregnew.aspx)。该方法 url(例如https://cloudservice.customer.com/api/authentication/token)在应用清单中注册为应用起始页并部署到站点集合。

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

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

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

    【讨论】:

    • 这太棒了!感谢分享。因此,您将 asp.net webapi 部署为 SP 应用程序,将起始页设置为任何有效的 webapi 调用(auth/token)。我不完全理解的是 jQuery 调用 appredirect.aspx 的结果是什么。你最终如何获得 Bearer 令牌以发送到 webapi?
    【解决方案2】:

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

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

    【讨论】:

    • 非常感谢柯克!现在这是问题的正确答案。
    【解决方案3】:

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

    Consume enterprise APIs secured with Azure AD in SharePoint Framework


    据说 Vittorio、Kirk 和他们的团队同时完成的工作,但也延伸到 Andrew 提供了出色的样本,真是太棒了;这并没有真正完全回答原始问题,因为其中一项要求是不要将组件作为加载项部件运行。

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

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

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

    但是,正如您在我的 cmets 中看到的那样,由于 IE 的安全区域实现,这在 IE 中无法正常工作。您必须确保您可以控制客户端上的 IE 安全区域,或者拥有特定于 IE 的替代解决方案。

    【讨论】:

    • 您好 Massimo,非常感谢您的评论。你能详细说明为什么它不能使用 adal.js 吗?我从未尝试过,但我认为它是为这种情况设计的。
    • 嗨 Luis,我假设您确实了解 OAuth 和 adal.js 的工作原理,通过要求重定向到联合登录页面并返回,以便获取访问令牌。如果您在页面中使用 adal.js 托管您的 JS 代码,则会发生一些重定向,这可能会将用户移出当前页面,并(可能自动)回到原始 SP 页面,这对用户来说会表现得很奇怪.让我说,adal.js 是为 SPA 场景设计的,但是您的代码还需要使用现有的强大(共享)身份提供程序(即 Azure AD)来保护。
    • Office 加载项是一个很好的例子,说明在哪里使用 SPA 或 JS 解决方案,但它也受到 Azure AD 的保护
    • 再次感谢 Massimo。我对 ADAL .net 有一些经验,但我需要在 adal.js 上动手脚。我想知道如果我们将我们的 SP 网站集注册为 Azure AD 应用程序,并在清单上启用隐式流,是否会有任何不同。
    • 谢谢 Luis,我正在真实地试验这个场景,我可能会有进一步的更新......待续......
    【解决方案4】:

    截至今天,AAD 不支持 OAuth2 隐式流(或 OpenId Connect 变体),因此您无法使用用户代理(浏览器)从 AAD 获取令牌,无论您是否使用手工制作协议或使用图书馆。 但是请留意未来的公告,因为这对我们来说是一个重要的场景! 高温高压 干杯,

    V.

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

    【讨论】:

    • 谢谢维托里奥!!知道我没有遗漏任何东西并且 MS 正在处理这种情况时感觉更好。期待那些未来的公告。算我一个早期采用者:) 干杯。
    • 终于似乎我们有来自微软的解决方案。尚未在 SP 页面中测试,但应该可以工作:cloudidentity.com/blog/2014/10/28/…
    【解决方案5】:

    你说你只能使用 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部分

    【讨论】:

      【解决方案6】:

      感谢您的帮助。

      嗯,它不是 SP 托管的应用程序,但它是相同的场景。它只是 SP Online 中的一个 SP 页面,所以我只能像在 SP 托管的应用程序中那样使用 JS 代码。

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

      但是,在我所看到的一切之后,我认为我们无能为力。我会再等几天,看看是否有人知道任何可以工作的奇怪解决方法,如果没有,我会将你的答案标记为有效。

      再次感谢!

      【讨论】:

        猜你喜欢
        • 2017-11-25
        • 1970-01-01
        • 2016-08-14
        • 1970-01-01
        • 2017-08-29
        • 2017-11-05
        • 2017-03-14
        • 2018-06-27
        • 1970-01-01
        相关资源
        最近更新 更多