偽装

最終更新日: 2010年4月14日

適用対象: SharePoint Foundation 2010

Windows SharePoint Services 3.0 の新機能である偽装を使用すると、別のユーザーに代わって操作を実行できます。ワークフローが完了し、ユーザーが Web サイトを使用しなくなってからかなり後に、そのユーザーに代わって更新を非同期に実行する必要がある "タイマー"操作などのシナリオで偽装が役立ちます。

注意

偽装の一時中断については、「呼び出し元ユーザーの偽装を一時中断しないようにする」を参照してください。

Microsoft.SharePoint 名前空間を使用してプログラムによって SharePoint サイトを作成したときに、ユーザー トークンを指定することで、特定のユーザーのコンテキストでオブジェクトを作成できるようになります。Microsoft.SharePoint.SPUser オブジェクトから取得される、ユーザーのユーザー トークンを指定することにより、そのユーザーを偽装できます。SPUserToken ユーザー トークンは、ユーザーの ID とドメイン グループ メンバーシップを含むバイナリ オブジェクトです。

このユーザー トークンを使用すると、該当のユーザーが変更を行っているかのように、Microsoft.SharePoint.SPSite コンストラクターを使用してサイト コレクション オブジェクトをインスタンス化し、実行できます。

通常、ユーザー資格情報を保存するためにセキュリティを強化する必要はありません。資格情報は、システム アカウントの特権で実行されているコード、またはユーザー情報の適切な特権で実行されているコードを使用して表示できます。

一般に、ユーザー トークンは約 24 時間後に期限切れとなります。遅延時間の長い操作を実行することを予定している場合は、ユーザー ID をデータベースに保存し、後で取得することもできます。ただし、この場合、データベースから情報を取得するオーバーヘッドが追加されるため、パフォーマンスが低下することがあります。操作を 5 分後に実行する場合など、操作を "少しだけ非同期" にするときには、この方法を使用する必要ありません。

偽装では双方向の信頼が必要となるため、SharePoint データベースと対話する Web フロントエンドが他の 2 つのネットワークの間に配置されたサーバー上にある場合、偽装を使用することはできません。このシナリオでは、Web フロントエンド サーバーが持つのは一方向の信頼だけです。また、グループ セキュリティ ID (SID) はフィルタ処理されないため、ドメイン間で SID のフィルタリング ポリシーの違反が発生することがあります。

偽装はセキュリティを管理するための強力な手法ですが、偽装機能を持つことが望ましくないユーザーによって、不要な操作が実行されないように注意して使用する必要があります。

注意

コード内で偽装アクションを実行した後もサイトでオブジェクトを引き続き操作するには、SPSiteオブジェクトを再インスタンス化する必要があります。

ユーザー トークンを管理する

SharePoint では、SharePoint データベースからユーザー トークン情報を取得します。ユーザーがサイトに一度もアクセスしていない場合、またはユーザーのトークンが 24 時間以上前に生成されている場合は、SharePoint はそのユーザーが属するグループのリストを更新することによって新しいユーザー トークンを生成します。

ユーザー アカウントが NT アカウントの場合、SharePoint は AuthZ インターフェイスを使用して、ActiveDirectory ディレクトリ サービスに対して TokenGroups プロパティのクエリを実行します。SharePoint がエクストラネット モードで実行されており、Active Directory に対してこのプロパティのクエリを実行する権限を持っていない場合、このクエリは失敗します。

ユーザー アカウントがメンバーシップ ユーザーの場合、SharePoint は ASP.NET RoleManager に対して、ユーザーが属するすべてのロールについてクエリを実行します。現在の実行可能ファイル用の適切な .config ファイルがない場合、このクエリは失敗します。

SharePoint が Active Directory または <roleManager> からユーザーのグループ メンバーシップを取得できない場合、新しく生成されるトークンには、ユーザーの一意のセキュリティ ID (SID) だけが含まれることになります。例外がスローされることはありませんが、ULS サーバー ログにエントリが書き込まれます。新しいトークンは、24 時間以内に再生成されないように SharePoint データベースにも書き込まれます。

SharePoint は、SharePoint データベースから新しいトークンを取得した後、または新しいトークンを生成して取得した後に、タイムスタンプを現在の時刻に設定し、そのトークンを呼び出し元に返します。これにより、トークンが 24 時間有効であることが保証されます。

SPUserToken オブジェクトが呼び出し元に返されたら、トークンが期限切れになってから使用しないように呼び出し元が注意する必要があります。トークンを取得した時刻を記録してトークンの有効期限を追跡し、現在の時刻と SPWebService.TokenTimeout との差を比較するヘルパー ユーティリティを作成できます。

期限切れになったトークンを使用して SharePoint Web サイトを作成すると、例外がスローされます。トークンの既定のタイムアウト値は 24 時間です。トークンのタイムアウト値には、SPWebService.TokenTimeout からアクセスできます。

Stsadm を使用して、トークンのタイムアウト値を取得または設定することもできます。次のコマンドを実行すると、ユーザー トークンから値が返されます。

stsadm -o getproperty -propertyname token-timeout

結果は次のとおりです。

<Property Exist="Yes" Value="1440" /> // 1440 minutes is 24 hours

次のコマンドを実行すると、ユーザー トークンの値が設定されます。

stsadm -o setproperty -propertyname token-timeout -propertyvalue 720

関連項目

概念

ヒントと既知の問題