为 SharePoint Server 搜索编写自定义安全修整程序

上次修改时间: 2015年3月9日

适用范围: SharePoint Server 2010

本文内容
实现 ISecurityTrimmer2 接口
部署自定义安全修整程序组件
注册自定义安全修整程序

不过,有可能在某些情况下,内置的安全修整结果并不足以满足您的要求,您需要实现自定义安全修整。SharePoint Server 搜索通过 ISecurityTrimmer2 接口提供对自定义安全修整的支持。

本主题提供有关 ISecurityTrimmer2 接口的信息,并描述使用 SharePoint Server 搜索自定义安全修整程序所需的以下步骤:

  1. 实现 ISecurityTrimmer2 接口。

  2. 部署自定义安全修整程序。

  3. 注册自定义安全修整程序。

实现 ISecurityTrimmer2 接口

若要创建针对搜索结果的自定义安全修整程序,您必须创建实现 ISecurityTrimmer2 接口的组件。该接口是位于 Microsoft.Office.Server.Search.dll 中的 Microsoft.Office.Server.Search.Query 命名空间的一部分。

ISecurityTrimmer2 接口包含您必须实现的两个方法:Initialize(NameValueCollection, SearchServiceApplication)CheckAccess(IList<String>, IDictionary<String, Object>, IIdentity)

Initialize 方法

将安全修整程序加载到工作进程中时,将执行 Initialize 方法,并且在回收工作进程之前将不会再执行此方法。应向此方法中传入两个参数,一个是包含在向Search Service 应用程序注册安全修整程序时为其指定的配置属性的 NameValueCollection,另一个是代表Search Service 应用程序的 SearchServiceApplication 对象。

可以通过使用在注册安全修整程序时指定的属性名来访问单独的配置属性。例如,以下代码将检索名为 CheckLimit 的配置属性的值。

public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication)
{
    if (staticProperties["CheckLimitProperty"] != null)
    {
         intCheckLimit = Convert.ToInt32(staticProperties["CheckLimitProperty"]);
    }
}

CheckAccess 方法

每当搜索查询返回与安全修整程序相关的爬网规则匹配的结果时,至少执行一次 CheckAccess 方法。

重要注释重要说明

对于一个搜索查询,可以多次执行 CheckAccess 方法,具体次数取决于传递给安全修整程序的结果数。

向此方法中传入了三个参数:一个是 IList<T> 对象,其中包含与爬网规则匹配的搜索结果中的每个内容项的 URL;另一个是 IDictionary<TKey, TValue> 对象,实现人员可以使用该对象来在针对同一个搜索查询的多个 CheckAccess 方法调用之间跟踪信息;还有一个是 IIdentity 对象,实现人员可以从该对象检索用户的标识。

CheckAccess 方法将返回一个表示 true 或 false 值数组的 BitArray 对象,该对象中的每个值对应于作为该方法的第一个参数进行传递的 IList 对象中的每个内容项 URL。查询引擎使用这些值来执行结果的安全修整。如果值为 true,则将对应的项包含在返回的结果中;如果值为 false,则删除对应的项。

实现 CheckAccess 方法时,您可以对每个项使用两条信息来确定为该项返回 true 还是返回 false:提交查询的用户的标识和内容项的 URL。

检索用户标识

您可以通过访问线程的当前主体来检索用户标识,如下所示。

IIdentity userIdentity = System.Threading.Thread.CurrentPrincipal.Identity;

另外,您还必须包含以下命名空间指令。

using System.Security.Principal;

您还可从 CheckAccess 方法的 passedUserIdentity 参数检索用户标识。

性能含义

自定义安全修整程序将会影响查询引擎的性能,因此,只有在 SharePoint Server 搜索所包含的安全修整功能无法满足您的要求的情况下,您才应使用自定义修整程序。

如果您必须使用自定义安全修整程序,则建议您限制修整程序针对单个查询所执行的访问检查数。例如,让我们考虑这样一种情况:内容索引包含一百万个文档,而且所有文档有一个通用的关键字。一个用户对此内容索引运行查询,但是该用户只具有访问第一百万个文件的权限,而没有访问其他文件的权限。如果不对访问检查数加以限制,则会重复调用 CheckAccess 方法直至最终返回用户具有访问权限的文档。在这种情况下,如果将访问检查数限制为 200 次(举例来说),然后停止访问检查,同时为用户返回一条消息,要求用户优化其查询以获取最佳结果,那么性能将会得到非常大的提高。

为此,您可以跟踪检查的项数,然后引发 PluggableAccessCheckException 异常。PluggableAccessCheckException 类提供一个带有参数的构造函数,您可以在该参数中指定包含要显示给用户的消息的字符串。请注意,您可以在 PluggableAccessCheckException 构造函数中指定一个字符串,但该字符串不会显示给最终用户。安全修整程序触发异常后,导致该异常的 trimmerID 将会被筛选掉,并且该结果将从搜索结果中排除。其他经过安全修整的结果(如果可用)将会返回并显示在搜索结果用户界面中。

有关演示可实现这一点的方法的示例,请参阅演练:对 SharePoint Server 搜索结果使用自定义安全修整程序中的步骤 3。

部署自定义安全修整程序组件

创建自定义安全修整程序之后,您必须将其部署到作为查询角色的任何服务器上的全局程序集缓存。演练:对 SharePoint Server 搜索结果使用自定义安全修整程序中的步骤 2 描述了如何将自定义安全修整程序部署到全局程序集缓存的过程。

注册自定义安全修整程序

安全修整程序注册与特定的Search Service 应用程序和爬网规则相关。

可以在 SharePoint 2010 命令行管理程序中使用 Windows PowerShell cmdlet SPEnterpriseSearchSecurityTrimmer 来注册自定义安全修整程序。有关使用此工具的详细信息,请参阅使用 SharePoint 2010 Management Shell 管理服务应用程序

下表描述 cmdlet 接受的参数。

表 1. PEnterpriseSearchSecurityTrimmer cmdlet 使用的参数

参数

说明

SearchApplication

必需。Search Service 应用程序的名称,例如"Search Service 应用程序"。

typeName

必需。自定义安全修整程序程序集的强名称。

RulePath

必需。安全修整程序的爬网规则。

id

必需。安全修整程序标识符 (ID)。此值是唯一的;如果使用一个已为另一个安全修整程序注册的 ID 来注册某个安全修整程序,则将使用第二个修整程序的注册来覆盖第一个修整程序的注册。

properties

可选。指定配置属性的名称-值对。必须使用以下格式:Name1~Value1~Name2~Value~…

演练:对 SharePoint Server 搜索结果使用自定义安全修整程序的步骤 2 中演示了一个用于注册自定义安全修整程序的基本命令的示例。该演练中的步骤 3 提供了指定安全修整程序的配置属性的示例。

请参阅

引用

ISecurityTrimmer2

概念

演练:对 SharePoint Server 搜索结果使用自定义安全修整程序