次の方法で共有


SharePoint での検索のカスタム セキュリティ トリミング

ISecurityTrimmerPreISecurityTrimmerPost という 2 種類のカスタム セキュリティ トリマー インターフェイスと、カスタム セキュリティ トリマーの作成に必要な手順について説明します。 クエリ時に、SharePoint の検索では、クロール コンポーネントから取得したセキュリティ情報を使用して、クエリを送信するユーザーの ID に基づいて検索結果のセキュリティ トリミングが実行されます。

ただし、シナリオによっては、組み込みのセキュリティ トリミングによる結果では要件を十分に満たせないことがあります。 そうしたシナリオでは、カスタム セキュリティ トリミングを実装する必要があります。 SharePoint での検索では、Microsoft.Office.Server.Search.Query 名前空間の ISecurityTrimmerPre インターフェイス、ISecurityTrimmerPost インターフェイス、ISecurityTrimmer2 インターフェイス (非推奨) を使用したカスタム セキュリティ トリミングのサポートが提供されます。

注:

カスタム プリトリマーはクレームのみサポートしており、ACL の Windows SID はサポートしていません。 SID クレームの種類のいずれかがカスタム プリトリマーから返された場合、インデックス内の結果の ACE は SID としてではなく、クレームとしてエンコードされます。 したがって SID に基づく Windows ユーザー ID と一致しません。

カスタム セキュリティ トリミング用のインターフェイスの実装

ISecurityTrimmerPre インターフェイスは、検索クエリが検索インデックスに一致する前にセキュリティ情報を追加するために検索クエリが書き換えられたプリトリミングまたは事前クエリ評価を実行します。 ISecurityTrimmerPost インターフェイスは、トリミング後またはクエリ後の評価を実行します。ここで、検索結果はユーザーに返される前に排除されます。

パフォーマンスと一般的な正確性のために、事前トリミングを使用することをお勧めします。プリトリミングにより、絞り込み条件データとヒット カウント インスタンスの情報漏洩を防ぎます。 後トリマーは、セキュリティ トリミングをクエリ フィルターで正確に表すことができない場合に使用できます。たとえば、公式営業時間中など、クエリを発行するユーザーの現地時間に応じてドキュメントをフィルター処理する必要がある場合です。

ISecurityTrimmerPre インターフェイスの実装

検索結果のカスタム セキュリティ プリトリマーを作成するには、 ISecurityTrimmerPre インターフェイスを実装したコンポーネントを作成する必要があります。

ISecurityTrimmerPre インターフェイスには、実装が必要な 2 つのメソッドとして、 Initialize(NameValueCollection, SearchServiceApplication)AddAccess(Boolean, Claims) が含まれています。

メソッドを初期化する

Initialize メソッドは、セキュリティ プリトリマーがワーカー プロセスに読み込まれる際に実行され、そのワーカー プロセスがリサイクルされるまで再実行されることはありません。 このメソッドには、次の 2 つのパラメーターを渡します。

  • staticProperties: セキュリティ トリマーがSearch Service アプリケーションに登録されるときに指定された構成プロパティを含む NameValueCollection オブジェクト。

  • searchApplication: Search Service アプリケーションを表す SearchServiceApplication オブジェクト。

AddAccess メソッド

AddAccess メソッドは、クエリの評価前に、受け取ったクエリのそれぞれについて、プリトリマーごとに 1 回実行されます。

このメソッドには、次の 2 つのパラメーターを渡します。

  • sessionProperties: クエリのプロパティを含む [T:System.Collections.Generic.IDictionary<String,Object>] オブジェクト。

  • userIdentity: ユーザー ID を含む IIdentity オブジェクト。

ISecurityTrimmerPost インターフェイスの実装

検索結果のカスタム セキュリティ ポストトリマーを作成するには、 ISecurityTrimmerPost インターフェイスを実装したコンポーネントを作成する必要があります。

ISecurityTrimmerPost インターフェイスには、Initialize(NameValueCollection,SearchServiceApplication)CheckAccess(IList String, IList<<String>, IDictionary<String>, Object>, IIdentity) の 2 つのメソッドが含まれています。

メソッドを初期化する

Initialize メソッドは、セキュリティ ポストトリマーがワーカー プロセスに読み込まれる際に実行され、そのワーカー プロセスがリサイクルされるまで再実行されることはありません。 このメソッドには、次の 2 つのパラメーターを渡します。

  • staticProperties: セキュリティ トリマーがSearch Service アプリケーションに登録されるときに指定された構成プロパティを含む NameValueCollection オブジェクト。

  • searchApplication: Search Service アプリケーションを表す SearchServiceApplication オブジェクト。

CheckAccess メソッド

CheckAccess メソッドは、クエリの評価後に、クエリ結果セットのそれぞれについて、ポストトリマーごとに 1 回実行されます。

このメソッドには、次の 4 つのパラメーターを渡します。

  • documentUrls: クロール ルールに一致する検索結果の各コンテンツ アイテムの URL を含む IList<T> オブジェクト。

  • documentAcls: セキュリティ トリマーの実装によってアクセスが決定される各コンテンツ アイテムの項目 ACL を含む IList<T> オブジェクト。

  • sessionProperties: IDictionary<TKey、一時的なプロパティ バッグを含む TValue> オブジェクト。

  • userIdentity: 実装者がユーザーの ID を取得できる IIdentity オブジェクト。

CheckAccess メソッドは、true または false の値の配列を表す BitArray オブジェクトを返します。これは、メソッドの最初のパラメーターとして渡される IList オブジェクト内のコンテンツ 項目 URL ごとに 1 つ返されます。 クエリ処理コンポーネントでは、これらの値を使用して、結果のセキュリティの後トリミングを実行します。 特定のコンテンツ項目の配列値が true の場合、返された結果に項目が含まれます。配列値が false の場合、項目は削除されます。

CheckAccess メソッドの実装時には、各項目に対して true または false のどちらを返すかを決定するための 2 つの情報として、クエリを送信したユーザーの ID とコンテンツ項目の URL を使用できます。 また、コネクタから CheckAccess メソッドにカスタム ドキュメントの ACL 情報を渡すこともできます。

セキュリティ トリマーのユーザー ID の取得

ユーザーの ID は、次のコード例に示すように、スレッドの現在のプリンシパルにアクセスすることで取得できます。


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

次の名前空間ディレクティブを含める必要もあります。

using System.Security.Principal;

また、ユーザーの ID は、 CheckAccess メソッドの passedUserIdentity パラメーターから取得することもできます。

コネクタからセキュリティ トリマーへのドキュメント ACL の引き渡し

コネクタとは、その名のとおり、SharePoint と外部データをホストする外部システムとを接続するコミュニケーション ブリッジです。 カスタム コネクタを操作する場合は、 docaclmeta ドキュメント プロパティを設定することで、ドキュメントの ACL 情報をポストトリマーに直接渡すことができます。 構成されたコネクタとポストトリマーでフィールドの書式と解釈が同じである限り、自由にコネクタを使用してカスタム データを渡すことができます。

コネクタによって docaclmeta に格納された文字列は、カスタム セキュリティ トリマーの CheckAccess メソッドが呼び出されると、 documentAcls パラメーターに表示されます。 docacl プロパティの通常のドキュメント ACL は、基本的なセキュリティによるトリミングによって処理され、カスタム セキュリティ トリマーには表示されません。 同様に、 docaclmeta プロパティは、基本的なセキュリティによるトリミングに影響しません。

ポストトリマーとこのトリマーがセキュリティ トリマーの絞り込み条件カウントに与える影響

ポストトリマーに関する作業を行う際には、 RelevantResultsRefinementResults という 2 種類の結果テーブルが存在することに注意が必要です。 ポストトリマーは、 RelevantResults にヒットした結果のみに適用されます。 その結果、ポストトリミングされたヒットに関連する絞り込み条件が存在し、 RefinementResults のカウント数は RelevantResults に等しいかそれより大きくなる可能性があります。 こうした挙動には、次の 2 つの方法で対処できます。

  • 絞り込み条件によって情報の漏洩が起こらないように、既定の Web パーツの絞り込みパネルから機密性の高い絞り込み条件を除外する。

  • RefinementResults カウントが RelevantResults カウントを上回った場合に RefinementResults の表示を適切に隠せるように、カスタム Web パーツを使用して、ポストトリマー使用時に結果または絞り込み条件を表示する。

セキュリティ トリマーに関する個別の構成プロパティの取得

個々の構成プロパティにアクセスするには、セキュリティ ポストトリマーの登録時に指定されたプロパティ名を使用します。 たとえば、次のコードは CheckLimit という構成プロパティの値を取得します。

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

カスタム セキュリティ トリマー コンポーネントの展開

作成したカスタム セキュリティ トリマーは、クエリの役割にあるいずれかのサーバーのグローバル アセンブリ キャッシュに展開する必要があります。 「 方法: SharePoint Server 検索結果にカスタム セキュリティ トリマーを使用 する」の手順 2 では、カスタム セキュリティ トリマーをグローバル アセンブリ キャッシュに展開するプロセスについて説明します。

カスタム セキュリティ トリマーの登録

ポストトリマーの場合は、カスタム セキュリティ トリマー登録を特定の Search Service アプリケーションやクロール ルールと関連付ける必要があります。プリトリマーの場合、この操作は省略できます。

カスタム セキュリティ トリマーを登録するには、SharePoint 管理シェルの SPEnterpriseSearchSecurityTrimmer コマンドレットを使用します。

次の表は、このコマンドレットで使用するパラメーターを説明したものです。

表 1. SPEnterpriseSearchSecurityTrimmer コマンドレットで使用するパラメーター

パラメーター 説明
SearchApplication
必須。 Search Service アプリケーションの名前です (例: "Search Service Application")。
typeName
必須。 カスタム セキュリティ トリマー アセンブリの厳密な名前です。
RulePath
ポストトリマーの場合は必須、プリトリマーの場合は省略可能。 セキュリティ トリマのクロール ルールです。
メモ: コンテンツ ソースにつき 1 つのクロール ルールを使用することをお勧めします。
id
必須です。 セキュリティ トリマー識別子 (ID)。 この値は一意です。セキュリティ トリマーが別のセキュリティ トリマーに既に登録されている ID で登録されている場合、最初のトリマーの登録は 2 番目のトリマーの登録で上書きされます。
properties
省略可能。 構成プロパティを指定する名前と値のペアです。 次の形式にする必要があります。 Name1~Value1~Name2~Value~???

カスタム セキュリティ トリマーを登録するための基本的なコマンドの例と、構成プロパティを指定するサンプルについては、「 方法: SharePoint Server 検索結果にカスタム セキュリティ トリマーを使用する」を参照してください。

関連項目