跨 SharePoint 加载项中的不同 Internet Explorer 安全区域使用跨域库

如果为加载项使用 SharePoint 跨域库,则应了解安全区域在 Internet Explorer 中的工作原理。 如果 SharePoint 网站和外接程序位于不同的区域,则您的外接程序可能会遇到一些通信问题。 本文介绍当您在不同的 Internet Explorer 安全区域中使用跨域库时将发生的情况。

Internet Explorer 中使用 SharePoint 跨域库的跨区域场景

由于安全原因,Internet Explorer 会阻止位于不同完整性级别(也称为安全区域)的页面共享 Cookie,因为每个完整性级别都具有其自己的 Cookie 存储。 页面的完整性级别由其最顶层的页面决定,而且页面内的所有框架都会共享同一完整性级别。 有关详细信息,请参阅注意跨区域场景中的 Cookie 共享

SharePoint 跨域库使用隐藏的 IFrame 和在 SharePoint 上托管的客户端代理页面来借助 JavaScript 启用客户端通信。 在页面中引用 sp.requestexecutor.js 文件时,可以使用跨域库。 有关详细信息,请参阅使用跨域库从加载项访问 SharePoint 数据

当远程加载项页和 SharePoint 网站位于不同的安全区域时,无法发送授权 Cookie。 如果没有授权 Cookie 且 IFrame 尝试加载代理页,则会被重定向到 SharePoint 登录页面。 出于安全考虑,不能将 SharePoint 登录页面包含在 IFrame 中。 在这些场景中,库不能加载代理页,并且无法与 SharePoint 通信。

下面的关系图显示了在其中无法加载代理页的跨区域场景。 首页将框架放入与 http://remoteserver/remotepage.html 相同的安全区域。 不加载代理页。

在其中无法加载代理页的跨区域场景

跨区域场景,无法加载代理页

以下是其中跨域库可能无法加载代理页的一些示例:

  • 你的客户使用的是 SharePoint Online,并且你的远程加载项页托管在 Intranet 服务器上。 此场景很容易导致代理页加载问题,因为 SharePoint Online URL 通常情况下并不位于本地 Intranet 区域。 在加载项的初始开发过程中,这是一种非常常见的情况,因为你可能会使用 IIS Express 或其他本地服务器来托管页面,而不使用完全限定的 Internet 域。

  • 你的客户通过基于窗体的身份验证在本地使用 SharePoint,并且你的远程页托管在云服务(例如,Microsoft Azure)上。

处理 SharePoint 加载项中的跨区域场景

在加载项开发(强烈推荐)和加载项运行期间,可以使用多种方法解决这一问题。

最佳做法:使用 apphost 模式

若要处理跨区域场景,我们建议在 SharePoint 中设置一个 apphost 页。 apphost 页是一个 SharePoint 页,它在 IFrame 中包含远程页。 apphost 页上的 IFrame 中的所有内容存在于与加载项 Web 相同的安全区域中。 远程页上的跨域库可以接收授权 Cookie 并成功加载代理页。

下面的关系图显示了使用 apphost 页模式处理的跨区域场景。

使用 apphost 页模式处理的跨区域场景

使用 apphost 处理的跨区域场景

apphost 页所需的代码十分简单。 apphost 页的主要部分是 SPAppIFrame 元素。 必须使用 CSS 使 IFrame 不可见,这样它就不会干扰加载项。

以下标记是简单 apphost 页的示例。 该标记将执行以下任务:

  • 声明使用 SharePoint 组件时所需的指令。

  • 声明用于使 IFrame 不可见的样式。

  • 声明 SPAppIFrame 并将目标设置为外接程序起始页。

<%@ Page 
    Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" 
    language="C#" %>
<%@ Register 
    Tagprefix="SharePoint" 
    Namespace="Microsoft.SharePoint.WebControls" 
    Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register 
    Tagprefix="Utilities" 
    Namespace="Microsoft.SharePoint.Utilities" 
    Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register 
    Tagprefix="WebPartPages" 
    Namespace="Microsoft.SharePoint.WebPartPages" 
    Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<html>
<head>
    <title>Your add-in page title</title>
    <style type="text/css">
        html, body
        {
            overflow:hidden;
        }
        
        body
        {
            margin:0px;
            padding:0px;
        }
         
        iframe 
        {
            border:0px;
            height:100%;
            width:100%;
        }
    </style>
</head>

<body>
    <SharePoint:SPAppIFrame 
        runat="server" 
        src="~remoteAppUrl/StartPage.html?{StandardTokens}" 
        frameborder="0">
    </SharePoint:SPAppIFrame>
</body>
</html>

如果您希望您的用户将链接深入您的外接程序的各个部分,则您的 apphost 页和 IFrame 的内容可进行协作以使这成为可能。 一种替代方式是在远程外接程序的每页中使用 IFrame 公告消息通信和单独的 URL。 若要每页具有单独的 URL,您可在外接程序 Web 中创建单独的页或在一个页上使用查询字符串参数。

替代方法:将站点添加到 Internet Explorer 中的同一安全区域

如果外接程序未设计为采用 apphost 模式,则您可通过将下列域添加到同一安全区域使它继续有效:

  • SharePoint 网站的域(例如,https://contoso.sharepoint.com)。

  • 云托管的加载项的域 (http://remoteserver)。

  • Microsoft 托管的登录页面和服务的域 (*.microsoftonline.com)。

管理员可以使用 Active Directory 策略将更改推送到组织中的所有计算机。

使用 apphost 模式的安全意义

需要指出的重要一点是,apphost 模式可有效地将远程页置于与加载项 Web 相同的安全区域中。 请务必了解将网站添加到安全区域的意义。

在其他浏览器中运行:Chrome、Firefox 和 Safari

其他浏览器(如 Google Chrome、Mozilla Firefox 和 Apple Safari)不会实现安全区域的概念。 如果浏览器不将 Cookie 隔离在单独的存储中,它可能不会遇到本文中所述的问题。 我们建议在加载项中遵循 apphost 模式。使用 apphost 模式可确保加载项在所提及的浏览器和 Internet Explorer 中正常运行,无需考虑 SharePoint 所在的安全区域。

另请参阅