エンタープライズ検索結果のカスタム セキュリティ トリミングの概要
Microsoft Office SharePoint Server 2007 でのエンタープライズ検索 は、クエリ時に検索結果のセキュリティ トリミングを実行します。結果は、クローラから取得したセキュリティ情報を使用して、クエリを送信したユーザーの ID に基づいてトリミングされます。動作の詳細については、「エンタープライズ検索セキュリティ モデル」を参照してください。
ただし、組み込みセキュリティ トリミングの結果が要件を満たさない場合で、カスタム セキュリティ トリミングを実装する必要がある場合など、特定のシナリオが発生する場合があります。 エンタープライズ検索 は、ISecurityTrimmer インターフェイスを介してカスタム セキュリティ トリミングのサポートを提供します。
このトピックでは、ISecurityTrimmer インターフェイスに関する情報を示し、エンタープライズ検索 でカスタム セキュリティ トリミングを使用するために必要な次の 3 つの手順について説明します。
ISecurityTrimmer インターフェイスを実装する
カスタム セキュリティ トリマを展開する
カスタム セキュリティ トリマを登録する
ISecurityTrimmer インターフェイスを実装する
エンタープライズ検索 の結果に対してカスタム セキュリティ トリマを作成するには、ISecurityTrimmer インターフェイスを実装するコンポーネントを作成する必要があります。 このインターフェイスは、Microsoft.Office.Server.Search.dll にある Microsoft.Office.Server.Search.Query 名前空間の一部です。
ISecurityTrimmer インターフェイスには、実装する必要がある 2 つメソッド (Initialize() と CheckAccess()) が含まれています。
Initialize メソッド
Initialize メソッドは、セキュリティ トリマがワーカー プロセスに読み込まれるときに実行され、ワーカー プロセスがリサイクルされるまで再実行されません。このメソッドには 2 つのパラメータが渡されます。1 つはセキュリティ トリマに指定した構成プロパティを含む System.Collections.Specialized.NameValueCollection オブジェクト、もう 1 つは共有サービス プロバイダ (SSP) の検索サービスを表す SearchContext オブジェクトです。
構成プロパティは、カスタム セキュリティ トリマの登録時に指定します (このトピックで後述します)。
セキュリティ トリマの登録時に指定したプロパティ名を使用して、個別の構成プロパティにアクセスできます。たとえば、次のコードは CheckLimit という名前の構成プロパティの値を取得します。
public void Initialize(NameValueCollection trimmerProperties, SearchContext srchContext)
{
int intCheckLimit = Convert.ToInt32(trimmerProperties["CheckLimit"]);
}
Initialize メソッドの実装を示すコード サンプルについては、「[ウォークスルー] 検索結果にカスタム セキュリティ トリマを使用する」の「手順 1: カスタム セキュリティ トリマを作成する」と「手順 3 (省略可能): 確認済みクロール URL 数の構成可能限度を指定します。」を参照してください。
CheckAccess メソッド
CheckAccess メソッドは、検索クエリがセキュリティ トリマに関連付けられたクロール ルールに一致する結果を返すたびに少なくとも 1 度実行されます。
注意
CheckAccess メソッドは、セキュリティ トリマに渡される結果の数に応じて、1 つの検索クエリに対して複数回実行できます。
このメソッドには 2 つのパラメータが渡されます。1 つはクロール ルールに一致する検索結果内の各コンテンツ項目の URL を含む System.Collections.Generic.IList オブジェクト、もう 1 つはシステム導入者が同じ検索クエリに対する複数の CheckAccess メソッドの呼び出しに関する情報を追跡するのに使用できる System.Collections.Generic.IDictionnary オブジェクトです。
CheckAccess メソッドは、このメソッドの最初のパラメータとして渡される IList オブジェクト内の各コンテンツ項目 URL について 1 つずつ、true または false 値の配列を表す System.Collections.BitArray オブジェクトを返します。クエリ エンジンは、これらの値を使用して、結果のセキュリティ トリミングを実行します。true の場合、項目は返された結果に含まれ、false の場合、項目は削除されます。
CheckAccess メソッドを実装すると、各項目のクエリを送信したユーザーの ID およびコンテンツ項目の URL の 2 つの情報を使用して、項目に対して true を返すか、false を返すかを決定することができます。
ユーザー ID を取得する
SharePoint サイトに構成された認証に応じて、クエリを送信したユーザーの ID を 2 つの方法で取得することができます。
サイトが Windows 認証を使用するように構成されている場合は、次のコードでユーザー名を取得します。
string strUser = WindowsIdentity.GetCurrent().Name;
次の名前空間ディレクティブも含める必要があります。
using System.Security.Principal;
サイトがフォーム認証またはカスタム認証を使用するように構成されている場合は、次のコードでユーザー名を取得します。
string strUser = HttpContext.Current.User.Identity.Name;
次の名前空間ディレクティブも含める必要があります。
using System.Web;
注意
System.Web のプロジェクトに参照を持つ必要もあります。
CheckAccess メソッドの基本的な実装を示すサンプル コードについては、「[ウォークスルー] 検索結果にカスタム セキュリティ トリマを使用する」の「手順 1: カスタム セキュリティ トリマを作成する」を参照してください。
パフォーマンスに与える影響
カスタム セキュリティ トリマはクエリ エンジンのパフォーマンスに影響を与えるので、エンタープライズ検索 に含まれるセキュリティ トリミング機能が要件を満たさない場合にのみカスタム トリマを使用するようにしてください。
カスタム セキュリティ トリマを使用する必要がある場合は、トリマが 1 つのクエリで実行するアクセス チェックの回数に制限を設定することをお勧めします。たとえば、コンテンツ インデックスに 100 万個のドキュメントが含まれ、すべてのドキュメントに共通のキーワードが 1 つあるシナリオについて考えてみます。ユーザーはコンテンツ インデックスでクエリを実行しますが、そのユーザーは 100 万個目のドキュメントにのみアクセス権があり、その他のドキュメントにはアクセス権がありません。アクセス チェックの回数に制限がない場合は、ユーザーがアクセス権を持つドキュメントが返されるまで CheckAccess メソッドが繰り返し呼び出されます。このシナリオでは、アクセス チェックの回数を 200 回などに制限して、それによってアクセス チェックを停止し、より良い結果を得るためにクエリを絞り込むようユーザーに要求するメッセージが返されるようにすると、パフォーマンスが大幅に改善します。
これを実行するには、チェックする項目の数を追跡し、PluggableAccessCheckException 例外をスローします。PluggableAccessCheckException クラスは、ユーザーへのメッセージを含む文字列を指定できるパラメータを持つコンストラクタを提供します。クエリ エンジンは、検索クエリに対する応答として結果の代わりにこのテキストを返します。
「[ウォークスルー] 検索結果にカスタム セキュリティ トリマを使用する」の「手順 3 (省略可能): 確認済みクロール URL 数の構成可能限度を指定します。」には、これを実装する方法の 1 つを示すサンプルが含まれています。
カスタム セキュリティ トリマ コンポーネントを展開する
カスタム セキュリティ トリマを作成したら、クエリの役割内にある任意のサーバー上のグローバル アセンブリ キャッシュに展開する必要があります。「手順 2 : カスタム セキュリティ トリマの配置および登録」では、カスタム セキュリティ トリマをグローバル アセンブリ キャッシュに展開する方法について説明しています。
カスタム セキュリティ トリマを登録する
s
セキュリティ トリマを登録するには、stsadm ユーティリティを使用して、registersecuritytrimmer 操作を指定します。次の表では、操作に必要なパラメータについて説明します。
パラメータ |
説明 |
---|---|
ssp |
必須。SSP の名前 (SharedServices1 など)。 |
id |
必須。セキュリティ トリマ ID。これは一意の値です。セキュリティ トリマが、別のセキュリティ トリマ用に既に登録されている ID で登録された場合、最初のトリマの登録が 2 番目のトリマの登録によって上書きされます。 |
typeName |
必須。カスタム セキュリティ トリマ アセンブリの厳密な名前。 |
rulepath |
必須。セキュリティ トリマのクロール ルール。 |
configprops |
オプション。構成プロパティを指定する名前と値の組。次の書式にする必要があります。 Name1~Value1~Name2~Value~… |
「手順 2 : カスタム セキュリティ トリマの配置および登録」に、カスタム セキュリティ トリマを登録する基本的なコマンドの例を示します。「手順 3 (省略可能): 確認済みクロール URL 数の構成可能限度を指定します。」では、セキュリティ トリマの構成プロパティを指定するサンプルを示します。