创建使用跨域库的 SharePoint 加载项
在某些情况下,SharePoint 加载项不能使用低信任或高信任授权系统,或者它们不是作为加载项获取 SharePoint 资源授权的唯一方式的最佳选择。
示例:
SharePoint 加载项的远程组件不在本地环境中,但公司防火墙会阻止 SharePoint 与 ACS 之间的服务器到服务器通信,从而阻止使用低信任系统。
SharePoint 加载项设计为单页 Web 应用程序,它依赖于客户端 JavaScript 来执行 SharePoint 的数据操作。
SharePoint 外接程序主要依赖于服务器到服务器调用来访问 SharePoint 数据(并由低信任或高信任系统授权),但需使用一些 JavaScript 调用进行补充。 例如,图形密集页面可以使用 JavaScript 对显示的数据进行一些次要更新,而无需重新加载整个页面。
但是,为安全起见,浏览器不允许托管在一个域中的 JavaScript 访问另一个域中的资源,因此需要特殊技术以允许远程 JavaScript 访问 SharePoint 资源。 SharePoint 跨域 JavaScript 库使你的远程 Web 应用程序可以轻松使用此技术。
注意
跨域库还可用于允许反向访问数据,即允许 SharePoint 页面上的 JavaScript 访问远程域中的数据。 有关详细信息,请参阅从 SharePoint 页面访问远程数据。
了解跨域库的体系结构
SharePoint 跨域库包含在 SP.RequestExecutor.js 文件中,该文件位于每个 SharePoint 网站的 /_layouts/15/ 虚拟文件夹中。 此文件中的脚本封装了一种众所周知的安全技术,用于克服浏览器对跨域脚本的限制:iFrame 可以通过 window.postMessage()
函数与其父级页面进行通信,即使 iFrame 中的页面位于 不同的域中也是如此。 因此,数据请求和响应通过使用对 postMessage()
的调用通过域边界传递。
警告
postMessage()
函数只能在支持 HTML 5 的浏览器上运行,因此使用跨域库的 SharePoint 加载项将不能在较旧浏览器上运行。
对于 SharePoint,跨域库加载在远程 Web 应用程序的页面上,它在此页面创建从 SharePoint 域托管特殊代理页面的隐藏 iFrame。 代理页面已存在于每个 SharePoint 网站中。
库用于创建包含向 SharePoint 的 REST API 发出 CRUD 调用所需的所有信息的 JavaScript 对象表示法 (JSON) 对象。 使用 postMessage()
将 JSON 对象传递到代理页。 在同时加载库的代理页面上,将解析 JSON 对象并将其重新构建为对 SharePoint 的 REST 调用。 由于代理页位于 SharePoint 域中,因此浏览器允许调用。
当然,SharePoint 外接程序的远程组件仍然必须具有 SharePoint 资源的授权访问权限。 可使用以下两种方法执行此操作:
在外接程序清单中,将外接程序主体类型设置为 RemoteWebApplication(提供程序托管的外接程序的默认设置)。 向 ACS 注册加载项时,注册包括远程 Web 应用程序的域。 在此应用场景下,SharePoint 信任向 ACS 注册的域,即使未使用任何属于服务器端低信任系统的令牌传递流。 有关注册加载项的详细信息,请参阅注册 SharePoint 加载项。
在 SharePoint 托管的加载项中,可以将加载项主体类型设置为默认值,即 Internal。 然后,可以将 Internal 元素的 AllowedRemoteHostUrl 属性设置为远程 Web 应用程序的 URL,如下面的示例所示。
<AppPrincipal>
<Internal AllowedRemoteHostUrl="https://example.com/Home.html" />
</AppPrincipal>
注意
如果使用第二个选项(内部加载项主体),则只能使用 JavaScript 和跨域库访问 SharePoint。 内部 SharePoint 加载项会阻止 SharePoint 客户端对象模型,因此无法拥有同时使用跨域库和低信任系统/高信任系统的双授权系统。
有关如何使用库的详细信息,请参阅使用跨域库从加载项访问 SharePoint 数据。
从 SharePoint 页面访问远程数据
SharePoint 跨域库也可以反向使用;也就是说,SharePoint 页面上的 JavaScript 可以使用该库从加载项的远程组件获取数据。 为此,可以反转跨域体系结构:在远程 Web 应用程序中创建代理页面。 该库从 SharePoint 页面调用,在该页面中它创建用于托管代理页面的 iFrame。
有关如何以这种方式使用库的详细信息,请参阅为 SharePoint 中的跨域库创建自定义代理页。