SharePoint 中的加载项授权策略类型

在阅读本文之前,应该先熟悉文章 SharePoint 中的加载项权限SharePoint 加载项的上下文标记 OAuth 流

加载项授权策略类型概述

SharePoint 提供三种类型的授权策略:

  • 仅加载项策略。 在使用仅加载项策略时,SharePoint 仅检查加载项主体的权限。 只有在当前加载项具有足够的权限来执行相关操作时,授权检查才会成功,而与当前用户的权限(如果有)无关。

    费用审批加载项是针对使用此策略而设计的一个加载项示例。 加载项让不能批准费用的用户能够批准低于某个特定数目的费用。 有关示例,请参阅下节中的应用场景

    注意

    某些 API 需要用户上下文,且无法通过仅加载项策略执行。 这包括很多用于与 Project Server 和 Project Online 交互的 API,以及用于执行搜索查询的 API。

  • 仅用户策略。 在使用仅用户策略时,SharePoint 仅检查用户的权限。 当用户直接访问资源而不使用加载项时(例如,当用户第一次打开 SharePoint 网站的主页或从 PowerShell 访问 SharePoint API 时),SharePoint 将使用该策略。

  • 用户 + 加载项策略。 使用用户 + 加载项策略时,SharePoint 会同时检查用户和加载项主体的权限。 只有在当前用户和加载项都具有执行相关操作的权限时,授权检查才会成功。

    例如,当 SharePoint 加载项需要获得对 SharePoint 上的用户资源的访问权限时,使用此策略。 (SharePoint 加载项远程组件中的代码应设计为可对 SharePoint 执行用户+加载项调用。)

使用仅加载项策略的加载项的示例应用场景

假定有一个名为 Adam 的 Contoso 销售经理购买了使用使用仅加载项策略的费用提交加载项。 当 Adam 选择购买加载项时,系统会提示Adam 允许加载项提升用户权限;即,允许加载项对 SharePoint 进行仅加载项调用。 Adam 为加载项授予所请求的权限。 然后,他购买了足够多的加载项许可证,供所有 Contoso 销售人员使用,并且他将此加载项安装在了销售团队的 SharePoint 网站中。

很快,销售人员就能使用新的费用提交加载项提交费用报告。 销售人员通常不能批准自己的费用报告,但可以在使用加载项时执行此操作,因为 Adam 授权它自动审批低于 50 美元的报告。 加载项会自动向 Adam 分配审批 50 美元或以上的报告任务。

这可以通过为 SharePoint 加载项提供对含已批准费用的 SharePoint 列表的写入权限来实现。 但是,在用户中,只有人力资源经理具有对该列表的写入权限。 如果费用少于 50 美元,加载项中的代码将通过对 SharePoint 执行仅加载项调用将费用添加到该列表。 由于不会检查用户的权限,50 美元以下的任何用户的提交都会被自动添加到已批准的费用列表中,即使用户对该列表没有写入权限也是如此。

加载项如何获取权限以使用仅加载项策略

为了能够对 SharePoint 执行仅外接程序的调用,您的外接程序必须请求使用仅外接程序策略的权限。 应在外接程序清单中提出此请求。 为此,可将 AllowAppOnlyPolicy 属性添加到 AppPermissionRequests 元素并将它设置为 true,如以下标记中所示:

    <AppPermissionRequests AllowAppOnlyPolicy="true">
        ...
    </AppPermissionRequests>

注意

SharePoint 外接程序以前称为“SharePoint 相关应用程序”。若要保持向后兼容性,该应用部件清单 (manifest) 架构未做更改,因此字符串“app”会显示在可能的元素和属性名称中。

系统将提示用户安装加载项批准此请求。 如果加载项要求使用租户范围内的权限,那么仅租户管理员可以授予使用仅加载项策略权限,因此只有租户管理员可以安装加载项。

如果加载项不要求使用较网站集范围更大的任何权限,那么网站集管理员就可以安装加载项。 有关权限范围的详细信息,请参阅 SharePoint 中的加载项权限

加载项如何进行仅加载项调用

对 SharePoint 执行仅外接程序调用与用户 + 外接程序调用之间的差异是包含在调用中访问令牌的类型。 以下代码显示如何获取托管代码中的用户 + 外接程序和仅外接程序的访问令牌。 TokenHelper.cs(或.vb)文件中为您提供了详细的编码,介绍了 Visual Studio Office 开发人员工具 自动添加到 Visual Studio 中的 项目 。

    string contextTokenString = TokenHelper.GetContextTokenFromRequest(Request);
    if (contextTokenString != null)
    {
        //Get context token.
        SharePointContextToken contextToken =
            TokenHelper.ReadAndValidateContextToken(contextTokenString, Request.Url.Authority);
        Uri sharepointUrl = new Uri(Request.QueryString["SPHostUrl"]);

        //Get user+add-in access token.
        string accessToken =
            TokenHelper.GetAccessToken(contextToken, sharepointUrl.Authority).AccessToken;

        ClientContext clientContext =
            TokenHelper.GetClientContextWithAccessToken(sharepointUrl.ToString(), accessToken);

        //Do something. 
        ...
        
        //Get add-in-only access token.
        string addinOnlyAccessToken = 
                TokenHelper.GetAppOnlyAccessToken(contextToken.TargetPrincipalName, 
                                sharepointUrl.Authority, contextToken.Realm).AccessToken;
            //Do something.
            ...
    }

注意

不执行 OAuth 经身份验证的调用的加载项(例如,仅包含在加载项 Web 中运行的 JavaScript 的加载项)无法使用仅加载项策略。 它们可以请求该权限,但无法利用该权限,因为这样做需要传递仅加载项 OAuth 令牌。 只有在 SharePoint 外部运行的 Web 应用程序的加载项可以创建和传递仅加载项令牌。

一般而言,需要存在当前用户才能进行调用。 对于仅加载项策略,SharePoint 将创建一个 SHAREPOINT\APP,这与现有的 SHAREPOINT\SYSTEM 用户类似。 所有仅加载项请求均由 SHAREPOINT\APP 发出。 无法通过基于用户的身份验证以 SHAREPOINT\APP 形式进行身份验证。

使用仅加载项策略的指南

由于仅加载项调用可有效地提升用户特权,应保守地创建加载项,以请求为其提供权限。 调用应仅在如下情况下使用仅加载项策略:

  • 外接程序需要将其权限提升得高于用户以进行特定调用;例如,在外接程序评估的条件下审批费用报告。

  • 外接程序未代表任何用户;例如,SharePoint 文档库上执行夜间维护任务的外接程序。

另请参阅