SharePoint 加载项的上下文标记 OAuth 流

在 SharePoint 中,针对提供程序托管的低信任加载项的 OAuth 身份验证和授权流包含加载项、SharePoint、授权服务器和浏览器之间在运行时的一系列交互。 此方案中的授权服务器是 Microsoft Azure 访问控制服务 (ACS)。

重要

作为 Azure Active Directory (Azure AD) 的一项服务,Azure 访问控制 (ACS) 将于 2018 年 11 月 7 日停用。 此停用不会影响使用 https://accounts.accesscontrol.windows.net 主机名(不受此停用影响)的 SharePoint 加载项模型。 有关详细信息,请参阅停用 Azure 访问控制对 SharePoint 加载项的影响

在提供程序托管的加载项中,你具有一个与 SharePoint 分开,而不属于 SharePoint 场或 SharePoint Online 租赁的远程 Web 应用程序或服务。 它可以托管在云中或本地服务器上。 在本文中,远程组件称为 Contoso.com。

注意

远程组件也可以托管对 SharePoint 项目所发生的事件(如列表或列表项)做出响应的事件接收器。 Contoso.com 可能会响应的远程事件示例包括列表事件,如添加或删除列表项;或 Web 事件,如添加或删除网站。 有关如何创建远程事件接收器的详细信息,请参阅在 SharePoint 加载项中创建远程事件接收器

Contoso.com 使用 SharePoint 客户端对象模型 (CSOM) 或 SharePoint REST API 调用 SharePoint。 Contoso.com 应用程序使用 OAuth 令牌传递流对 SharePoint 进行身份验证。 SharePoint 和 Contoso.com 相互不信任,但都信任 ACS,并会接受 ACS 颁发的令牌。

涉及三种令牌:SharePoint 让 ACS 创建上下文令牌,SharePoint 将其转发到 Constoso.com。 Contoso.com 验证上下文令牌由 ACS 办法并信任它。 然后,Contoso.com 从上下文令牌提取刷新令牌并用它从 ACS 中直接获取访问令牌。 它将访问令牌包含在对 SharePoint 的所有请求中。 SharePoint 确认访问令牌由 ACS 颁发,从而对从 Contoso.com 发出的请求做出响应。

你在远程组件中提供令牌处理代码(但是,如果你的远程组件托管在 .NET 上,Microsoft Visual Studio 的 Office 开发人员工具将提供示例代码,为你执行大部分工作。) 有关令牌处理代码的详细信息,请参阅在提供程序托管的低信任 SharePoint 加载项中处理安全令牌

先决条件

SharePoint 加载项使用上下文令牌流之前,必须先完成以下准备步骤。

  • 以下要求仅适用于除了 SharePoint Online 之外,在本地安装 SharePoint 加载项;如果只是将 SharePoint 加载项安装到 SharePoint Online,这些要求不适用

  • 不论加载项是安装到 SharePoint Online 还是本地 SharePoint 场,SharePoint 加载项必须在 ACS 中注册。 有关如何执行此操作的详细信息,请参阅注册 SharePoint 加载项。此外,作为注册的一部分,加载项还为 ACS 提供其客户端 ID 和客户端密码。

上下文令牌流步骤

下图中显示了 SharePoint 提供程序托管的加载项的 OAuth 身份验证和授权流。

OAuth 上下文令牌流

OAuth 身份验证流程

下列步骤与图中的数字对应:

  1. 用户从 SharePoint 启动 SharePoint 外接程序。 外接程序的设计决定了如何执行此操作:

    • 如果加载项设计为在加载项部件(本质上是关于 IFRAME 的包装程序)中显示远程 Web 应用程序(中 Contoso.com 上),那么启动加载项就是表示导航到包含加载项部件的 SharePoint 页面。 (如果用户尚未登录,SharePoint 将提示用户登录。)SharePoint 处理页面并检测到页面上有一个 Contoso.com 应用程序中的组件。 (有关加载项部件的详细信息,请参阅创建加载项部件以安装 SharePoint 加载项。)
    • 如果加载项设计为在浏览器使用完整页面,用户可通过在 SharePoint 网站的“网站内容”页面上选择加载项磁贴来启动它。 (一种变体是加载项包含启动远程组件的自定义菜单或功能区项目时的情况。)
  2. 不论加载项如何启动,SharePoint 必须获取可以发送到 Contoso.com 应用程序的上下文令牌,因此它要求 ACS 创建包含 SharePoint 上下文相关信息的上下文令牌,其中包括当前用户、远程应用程序 URL 和其他信息。 上下文令牌还包含加密刷新令牌。

  3. ACS 借助使用 Contoso.com 加载项密码的算法签署上下文令牌,并将其返回到 SharePoint。 只有 ACS 和 Contoso.com 加载项知道密码。

  4. 如果在加载项部件中显示 Contoso.com 应用程序,SharePoint 会呈现托管加载项部件的页面,并将上下文令牌添加到 URL 中,加载项部件中的 IFRAME 会调用该 URL 来获取其内容。 如果 Contoso.com 应用程序是完整页面,SharePoint 会将浏览器重定向到 Contoso.com,并包括上下文令牌作为重定向响应的一部分。

  5. 上下文令牌包含在发送给 Contoso.com 服务器的浏览器请求中。

  6. Contoso.com 服务器获取上下文令牌并验证签名,它之所以可以这样操作,是因为它知道客户端密码。 这可向 Contoso.com 保证令牌由 ACS 颁发,而不是冒充 SharePoint 的骗子。 Contoso.com 从上下文令牌中提取刷新令牌,并通过请求将允许其访问 SharePoint 的访问令牌的形式,将其与其他信息(包括客户端 ID 和客户端机密)一起发送到 ACS。

  7. ACS 验证刷新令牌,确保令牌由 ACS 颁发,然后将访问令牌返回到 Contoso.com。 Contoso.com 可以选择缓存此访问令牌,因此不会在每次访问 SharePoint 时都要求 ACS 提供访问令牌。 默认情况下,访问令牌一次适合缓存几小时。 (截至本文撰写时,ACS 颁发的 SharePoint 访问令牌的默认过期时间为 12 小时,但这可能会更改。)

每个访问令牌仅供在初始授权请求中指定的用户帐户使用,仅授予对该请求中指定的服务(本示例中为 SharePoint)的访问权限。 刷新令牌的有效期更长(截至本文撰写时为六个月),并且也可以缓存。 因此,同一个刷新令牌可以从 ACS 兑换新的访问令牌,直到刷新令牌本身过期。 (有关缓存令牌的详细信息,请参阅在提供程序托管的低信任 SharePoint 加载项中处理安全令牌。)

刷新令牌过期后,Contoso.com 可以通过获取新的上下文令牌来获取新的刷新令牌。 有关详细信息,请参阅获取新的上下文令牌

  1. Contoso.com 使用访问令牌发出 SharePoint REST API 调用或对 spnv 的 CSOM 请求。 它通过在 HTTP Authorization 标头中传递 OAuth 访问令牌来执行此操作。 (如果远程组件托管在 .NET 平台上,则创建标头的示例代码在 Visual Studio 的 Office 开发人员工具中提供。)
  2. SharePoint 验证访问令牌,以便确保令牌是由 ACS 颁发的。 然后,它会发送 Contoso.com 请求的数据 Contoso.com,或者执行创建、读取、更新或删除 (CRUD) Contoso.com 请求的操作。
  3. Contoso.com 应用程序页面在浏览器(或加载项部件的 IFRAME)中显示。

另请参阅