ユーザーが特定のSharPointグループに所属するかを判定する No.1[オンプレ]

2017/05/07

「ユーザーが特定のSharePointグループに所属するか」とタイトルだけ見ると簡単にできそうですが、中々そうでもありません。その理由と対処方法を記載しています。

 ログインユーザーでも任意のユーザーでも在り得ますが、あるユーザーが特定のSharePointグループに所属しているかを判断したい状況があります。例えば、ある業務上の管理処理の実行を、特定のSharePointグループのメンバーにのみ許可したい場合などです。

 ドキュメントライブラリの管理などでは、管理者用のSharePointグループを作成して、任意のユーザーをメンバーとして、そのSharePointグループに必要な権限を付与すれば、標準機能の範囲で実現できます。しかし、業務システムのカスタマイズプログラムで、ある処理を特定のSharePointグループのメンバーにのみ許可したい場合は、ユーザーがそのSharePointグループに所属しているかを判定する必要があります。

 

 

①メンバーを一人づつ見ていく

 

 この処理として先ず思いつくのが、SharePointグループのメンバーを一人づつ見ていき特定のユーザーであるかを判定する方法です。

 

 

 SPGroupのUserプロパティで取得できるユーザーは、SharePointグループに直接登録されたユーザーか、直接登録されたActive Directoryのセキュリティグループとなります。

 通常の業務システムでは、SharePointグループにActive Directoryのセキュリティグループを所属させてユーザーを管理します。この詳細は、

SharePointグループのフラットな管理[オンライン・オンプレ]

に記載しましたが、企業では組織の改編やユーザーの人事異動が定期的に行われるため、この様な変更によっても、SharePoint側への影響を避け運用管理を複雑化させないために、SharePointグループに直接ユーザーを登録することは通常行いません。

 上記のプログラム例では、SharePointグループに直接登録されたユーザーはSharePointグループのメンバーであると認識できますが、Active Directoryのセキュリティグループのメンバーとなっているユーザーは、SharePointグループのメンバーであると認識されません。

 

 

②Active Directoryのメンバーでも判定できる方法

 

 Active Directoryのセキュリティグループのメンバーとなっているユーザーに対しても、SharePointグループのメンバーであるかを判断するためにContainsCurrentUserというプロパティが用意されています。

現在のログインユーザーについて、SharePointグループに所属するかどうかを判定できます。

 

 

 しかし、ここに落とし穴があります。

 

 

③クレームトークンのキャッシュ

 

 上記の様にして、要件を満たすプログラムが作成できたので、さっそくテストを行おうと思います。Active Directoryにテスト用のセキュリティグループを作成し、テストユーザーをそのセキュリティグループのメンバーとして、そのセキュリティグループをSharePointグループに登録します。

 この様にしてテストユーザーでログインして、上記のプログラムでSharePointグループに所属しているかをチェックすると、メンバーとして認識されるはずが認識されません。

 実は、SharePoint2013からクレーム認証になり、ユーザーがどのActive Directoryのセキュリティグループのメンバーであるかは、そのクレームトークンに格納されています。そして、このクレームトークンですがファーム内でキャッシュされる仕組みとなっています。

 このため、テストに際し、テストユーザーを新たにActive Directoryのセキュリティグループのメンバーにしても、キャッシュされたクレームトークンには該当するセキュリティグループのメンバーであるという情報が存在しないため、望ましい結果が得られません。

 実運用ではキャッシュは定期的に更新されるので、余程の緊急性がない限り問題はないのですが、プログラムのテストではキャッシュの更新を待っていたのでは話になりません。

 以下の様にして、キャッシュを強制的にクリアしてしまいます。

 

(1)IISのアプリケーションプールをリスタートする。

 先ず、Webフロントエンドサーバーにおいて、「インターネット インフォメーション サービス(IIS) マネージャー」を開き、テスト対象のサイトコレクションが存在するWebアプリケーションプールをリスタートします。

 

 

 

(2)分散キャッシュサービス上のキャッシュのクリア

 次に、Webフロントエンドサーバーで、「SharePoint 2013 管理シェル」を管理者モードで開き、次のコマンドを実行します。

 

たまに、黄色い字で「Not all items were cleared.」と表示されますが、特に問題はありません。

 

 

④ログインユーザー以外のユーザーについて

 

 SPGroupのContainsCurrentUserプロパティでは、ログインユーザーがメンバーであるかどうかを判定できますが、任意のユーザーについては判定できません。

こんな感じで、偽装すれば可能かと思いますが、

 

 

上手くいきません。

偽装したユーザーではなく、ログインユーザーがメンバーであるかが返ってきてしまいます。

ContainsCurrentUserプロパティでは、常にログインユーザーのクレームトークンを参照するのが原因かと思います。

 任意のユーザーが特定のSharePointグループに所属するかをどう判定するかについては、次の機会に記載したいと思います。

 

以上となります。

お役に立てれば幸いです。

 

 

 

 

 

 

 

Share on Facebook
Share on Twitter
Please reload

RECENT POST
Please reload

Copyright© 2017  Aiprovide Corporation all Right Reserved.

  • Aiprovide Coroporation
  • Aiprovide Corporation