SharePoint Server の検索結果でカスタム セキュリティ トリマーを使用する
このハウツーでは、Microsoft Visual Studio 2010 を使用して、SharePoint の検索のカスタム セキュリティ トリマーを実装 (作成、展開、および登録) する手順について説明します。
SharePoint での検索は、検索結果に対するクエリ時間のセキュリティによるトリミングを実行します。 ただし、カスタム セキュリティによるトリミングを実行しなければならない場合もあります。 SharePoint のSearchは、Microsoft.Office.Server.Searchを通じてこれらのシナリオをサポートします。Query.ISecurityTrimmerPre 、Microsoft.Office.Server.Search。Microsoft.Office.Server.Search の Query.ISecurityTrimmerPost、および ISecurityTrimmer2 (非推奨) インターフェイス。クエリ名前空間。
カスタム セキュリティ トリミングには、プリトリミングとポストトリミングの 2 種類があります。 プリトリミングとは、セキュリティ情報を追加するようにクエリを書き換えてから検索インデックスに突き合わせる、クエリ前評価を示します。 ポストトリミングとは、検索結果の余分な部分を取り除いてからユーザーに返す、クエリ後評価を示します。 パフォーマンスと全体的な正確性を重視する場合は、プリトリミングの使用をお勧めします。ポストトリミングはデータの絞り込みとヒット カウント インスタンスによる情報の漏れを防ぐことができます。
セキュリティ トリマー登録処理によって、カスタム セキュリティ トリマーの構成プロパティを指定することができます。
概要
SharePoint の検索のカスタム セキュリティ トリミングは 2 つのインターフェイスで構成され、検索結果のプリトリミングまたはポストトリミングを実行できます。 このハウツーでは、両方のインターフェイスについて、独自のセキュリティ トリマーを作成して登録するために必要な手順を説明します。
前提条件
このハウツーを完了するには、開発環境に次のツールがインストールされている必要があります。
- Microsoft SharePoint の検索
- Microsoft Visual Studio 2010 または同等の Microsoft .NET Framework 互換の開発ツール
カスタム セキュリティ トリマー プロジェクトを設定する
この手順では、カスタム セキュリティ トリマー プロジェクトを作成し、必要な参照をプロジェクトに追加します。
カスタム セキュリティ トリマーのプロジェクトを作成するには
- Visual Studio を開き、[ ファイル]、[ [新規]、[ プロジェクト] を選択します。
- [ プロジェクトの種類] で、[ C#] の [ SharePoint] を選択します。
- [ テンプレート] の [ 空の SharePoint プロジェクト] を選択します。 [ 名前] フィールドに「 CustomSecurityTrimmerSample」と入力し、[ OK] をクリックします。
- SharePoint カスタマイズ ウィザードで、[ ファーム ソリューションとして配置する] を選択します。[ 完了] をクリックします。
カスタム セキュリティ トリマー プロジェクトに参照を追加するには
[ プロジェクト] メニューの [ 参照の追加] をクリックします。
[ .NET] タブで、以下のコンポーネント名を持つ参照を選択した後、[ OK] をクリックします。
- Microsoft Search component
[ .NET] タブには、コンポーネント名が [ Microsoft Search component] のエントリが 2 つ表示されます。 [パス] 列が \ISAPI\Microsoft.Office.Server.Search.dll されているエントリを選択します。 このエントリが [ 参照の追加] ダイアログ ボックスの [ .NET] タブにない場合は、Microsoft.Office.Server.Search.dl のパスを使用して [ 参照] タブから参照を追加する必要があります。
- Microsoft.IdentityModel
[ Microsoft.IdentityModel] が [ .NET] タブにない場合は、以下のパスを使用して [ 参照] タブから Microsoft.IdentityModel.dll への参照を追加する必要があります。
%ProgramFiles%\\Reference Assemblies\\Microsoft\\Windows Identity Foundation\\v4.0.
カスタム セキュリティ プリトリマーを作成する
セキュリティ プリトリマー用のクラス ファイルを作成するには
- [ プロジェクト] メニューの [ 新しい項目の追加] をクリックします。
- [ インストールされているテンプレート] の [ Visual C# アイテム] で、[ コード] をクリックし、[ クラス] をクリックします。
- 「 CustomSecurityPreTrimmer.cs」と入力し、[ 追加] をクリックします。
カスタム セキュリティ プリトリマーのコードを記述する
カスタム セキュリティ トリマーは、 ISecurityTrimmerPre インターフェイスを実装する必要があります。 以下のコード例は、このインターフェイスの基本的な実装を示しています。
CustomSecurityPreTrimmer の既定のコードを変更するには
次の using ディレクティブをクラスの先頭に追加します。
using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Security.Principal; using Microsoft.IdentityModel.Claims; using Microsoft.Office.Server.Search.Query; using Microsoft.Office.Server.Search.Administration;
次のコードで示すように、 CustomSecurityPreTrimmer クラスがクラス宣言で ISecurityTrimmerPre インターフェイスを実装することを指定します。
public class CustomSecurityPreTrimmer : ISecurityTrimmerPre
ISecurityTrimmerPre インターフェイス メソッドを実装するには
Initialize() メソッド宣言の次のコードを追加します。
public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication) { }
このサンプルの基本バージョンでは、 Initialize メソッドにコードが含まれていません。
AddAccess() メソッド宣言の次のコードを追加します。
public IEnumerable<Tuple<Claim, bool>> AddAccess( IDictionary<string, object> sessionProperties, IIdentity passedUserIdentity) { //AddAccess method implementation, see steps 3-5. }
AddAccess メソッド実装の最初の部分では、 passedUserIdentity を調べてユーザーを確認します。
if (passedUserIdentity == null) { throw new ArgumentException("AddAccess method is called with invalid user identity parameter", "passedUserIdentity"); } String strUser = null; var claimsIdentity = (IClaimsIdentity)passedUserIdentity; if (claimsIdentity != null) { foreach (var claim in claimsIdentity.Claims) { if (claim == null) { continue; } // strUser is "domain\\\\user" format when web app is in Claims Windows Mode if (SPClaimTypes.Equals(claim.ClaimType, SPClaimTypes.UserLogonName)) { strUser = claim.Value; break; } // strUser2 is "S-1-5-21-2127521184-1604012920-1887927527-66602" when web app is in Legacy Windows Mode // In this case we need to convert it into NT user format. if (SPClaimTypes.Equals(claim.ClaimType, ClaimTypes.PrimarySid)) { strUser = claim.Value; SecurityIdentifier sid = new SecurityIdentifier(strUser); strUser = sid.Translate(typeof(NTAccount)).Value; break; } } }
次のコードで示すように、リストを作成し、リストにクレームのデータを取り込み、リストを返します。
var claims = new LinkedList<Tuple<Claim, bool>>(); if (!string.IsNullOrEmpty(strUser)) { var groupMembership = GetMembership(strUser); if (!string.IsNullOrEmpty(groupMembership)) { var groups = groupMembership.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries); foreach (var group in groups) { claims.AddLast(new Tuple<Claim, bool>( new Claim("http://schemas.happy.bdc.microsoft.com/claims/acl", group), false)); } } } return claims; }
GetMembership メソッドには、トリマーのカスタム ロジックが含まれています。
カスタム セキュリティ ポストトリマーを作成する
セキュリティ ポストトリマー用のクラス ファイルを作成するには
- [ プロジェクト] メニューの [ 新しい項目の追加] をクリックします。
- [ インストールされているテンプレート] の [ Visual C# アイテム] で、[ コード] をクリックし、[ クラス] をクリックします。
- 「CustomSecurityPostTrimmer.cs」と入力し、[ 追加] をクリックします。
カスタム セキュリティ ポストトリマー コードを記述する
カスタム セキュリティ トリマーは、 ISecurityTrimmerPost インターフェイスを実装する必要があります。 このセクションのコード例は、このインターフェイスの基本的な実装を示しています。
CustomSecurityPostTrimmer の既定のコードを変更するには
次の using ディレクティブをクラスの先頭に追加します。
using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Security.Principal; using Microsoft.IdentityModel.Claims; using Microsoft.Office.Server.Search.Query; using Microsoft.Office.Server.Search.Administration;
CustomSecurityPostTrimmer クラスが ISecurityTrimmerPost インターフェイスを実装するように、クラス宣言を以下のように指定します。
public class CustomSecurityPostTrimmer : ISecurityTrimmerPost
ISecurityTrimmerPost インターフェイス メソッドを実装するには
Initialize() メソッド宣言の次のコードを追加します。
public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication) { }
このサンプルの基本バージョンでは、Initialize メソッドにコードは含まれていません。
CheckAccess() メソッド宣言の次のコードを追加します。
public BitArray CheckAccess(IList<string> documentCrawlUrls, IList<string> documentAcls, IDictionary<string, object> sessionProperties, IIdentity passedUserIdentity) { //CheckAccess method implementation, see steps 3-5. }
CheckAccess メソッド実装の最初の部分では、次のコードで示すように、 BitArray 変数を宣言して初期化し、 documentCrawlUrls コレクション内の各 URL のアクセス チェックの結果を格納して、クエリを送信したユーザーを取得します。
if (documentCrawlUrls == null) { throw new ArgumentException("CheckAccess method is called with invalid URL list", "documentCrawlUrls"); } if (documentAcls == null) { throw new ArgumentException("CheckAccess method is called with invalid documentAcls list", "documentAcls"); } if (passedUserIdentity == null) { throw new ArgumentException("CheckAccess method is called with invalid user identity parameter", "passedUserIdentity"); }
次のコードで示すように、コレクション内の各クロール URL をループし、アクセス チェックを実行して、クエリを送信したユーザーがクロール URL に関連付けられたコンテンツ アイテムにアクセスできるかどうかを判断します。
// Initialize the bit array with TRUE value which means all results are visible by default. var urlStatusArray = new BitArray(documentCrawlUrls.Count, true); var claimsIdentity = (IClaimsIdentity)passedUserIdentity; if (claimsIdentity != null) { var userGroups = GetGroupList(claimsIdentity.Claims); var numberDocs = documentCrawlUrls.Count; for (var i = 0; i < numberDocs; ++i) { if (!string.IsNullOrEmpty(documentAcls[i])) { urlStatusArray[i] = VerifyAccess(documentAcls[i], userGroups); } } }
次のように、ユーザーがコンテンツ アイテムにアクセスできる場合は、そのインデックス urlStatusArray[i] にある BitArray アイテムの値を true に設定します。それ以外の場合は、 false に設定します。
次のコードで示すように、CheckAccess メソッドの戻り値を urlStatusArray に設定します。
return urlStatusArray;
カスタム セキュリティ トリマーを登録する
この手順ではカスタム セキュリティ トリマーを構成する方法を示し、以下の作業について説明します。
- Windows PowerShell コマンドレットを使用して、検索サービス アプリケーションのカスタム セキュリティ トリマーを登録する。
- SharePoint 検索ホスト コントローラー (SPSearchHostController) を再起動する。
カスタム セキュリティ トリマーを登録する
SharePoint 管理シェルを使用して、カスタム セキュリティ トリマーを ClassName に登録します。 この場合、 ClassName は CustomSecurityPreTrimmer または CustomSecurityPostTrimmer のいずれかになります。 次の手順は、検索サービス アプリケーションの ID を 1 に設定してカスタム セキュリティ トリマーを登録する方法を示しています。
カスタム セキュリティ トリマーを登録するには
Windows エクスプローラーで、パス <Local_Drive:\WINDOWS\assembly で CustomSecurityTrimmerSample.dll> を見つけます。
ファイルのショートカット メニューを開き、[プロパティ] を選択します。
[ プロパティ] ダイアログ ボックスの [ 全般] タブで、トークンを選択してコピーします。
SharePoint 管理シェル を開きます。 このツールの使用方法については、「SharePoint 2010 Management Shell を使用したサービス アプリケーションの管理」を参照してください。
コマンド プロンプトで、次のコマンドを入力します。
New-SPEnterpriseSearchSecurityTrimmer -SearchApplication "Search Service Application" -typeName "CustomSecurityTrimmerSample.ClassName, CustomSecurityTrimmerSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=token" -RulePath "xmldoc://*"
コマンドで、 ClassName をCustomSecurityPreTrimmer または CustomSecurityPostTrimmer に置き換え、 トークン を CustomSecurityTrimmerSample.dll ファイルの公開キー トークンに置き換えます。 クロール ルール ( "xmldoc://*") とすべてのポストトリマーを関連付ける必要がありますが、プリトリマーについては任意です。
注:
複数のフロントエンド Web サーバーがある場合は、ファーム内のすべてのフロントエンド Web サーバー上のグローバル アセンブリ キャッシュにセキュリティ トリマーを展開する必要があります。
セキュリティ トリマーが登録されていることを次の PowerShell コマンドレットで確認してください。
$searchApp = Get-SPEnterpriseSearchServiceApplication $searchApp | Get-SPEnterpriseSearchSecurityTrimmer
セキュリティ トリマーは結果に表示されます。
SharePoint 検索ホスト コントローラーを再起動するには
次の PowerShell コマンドレットを入力して、検索サービスを再起動できます。
net restart sphostcontrollerservice