.NET TIPS [ASP.NET]Webパーツでログイン・ユーザーごとに表示可能なパーツを判定するには?[2.0のみ、C#、VB]山田 祥寛2006/11/10 |
![]() |
|
「TIPS:[ASP.NET]WebPartsコントロールでパーソナライズ・ページを構築するには?」では、WebPartsコントロールを利用してパーソナライズ可能なページを作成する方法について紹介した。WebPartsコントロールを利用することで、エンドユーザーは使用頻度や好みに応じて情報(パーツ)を選択表示し、かつ、ページ上の自由な位置に配置することができる。不要な情報は削除することもできるし、よく使う情報はより上位に配置することもできるため、ユーザーそれぞれのニーズに合致した機能性を提供できるというわけだ。
もっとも、パーソナライズといった場合、必ずしもエンドユーザーによる情報の取捨選択を意味するケースばかりではない。エンドユーザーの権限(ロール)などに応じて、あらかじめ表示する情報を取捨選択したいというケースも多くあるはずだ。このようなケースでも、WebPartsコントロールではAuthorizeイベントを利用することで、限りなく少ないコーディングで表示のフィルタリングを制御することができる。
本稿では、Authorizeイベントを利用して、前掲のTIPSのサンプル・プログラムに対してパーツ表示のフィルタリング機能を実装してみよう。なお、本サンプルを実行するに当たっては、あらかじめ“admin”もしくは“usr”ロールを持ったユーザーを「ASP.NET Webアプリケーション管理ツール」(以降、管理ツール)上で作成しておく必要がある。管理ツールの詳細な使い方については、「TIPS:[ASP.NET]セキュリティ・コントロールでログイン機能を作成するには?」を参考にしていただきたい。
以下は本稿のサンプル・プログラムを実際に動かしたところだ。
![]() |
adminロールに所属するユーザーでアクセスした場合 |
Imageコントロールを非表示にし、Calendarコントロールを表示。 |
![]() |
usrロールに所属するユーザーでアクセスした場合 |
Calendarコントロールを非表示にし、Imageコントロールを表示。 |
それではさっそく、具体的な実装手順を見ていくことにしよう。
1. ページ上のWebパーツにフィルタ文字列を設定する
ロールによる表示フィルタリングを行うには、まず対象のWebパーツに対して、フィルタリングのキーとなる文字列(この場合はアクセスを認めるロール名)を指定する必要がある。コード・エディタからそれぞれ以下のようにプロパティを追加してみよう(太字が追記個所)。
|
|
個々のWebパーツに対してフィルタ文字列を定義(WebParts_cs.aspx/WebParts_vb.aspx) |
フィルタ文字列を定義するのは、GenericWebPartクラス(System.Web.UI.WebControls.WebParts名前空間)のAuthorizationFilterプロパティの役割だ。ただし「TIPS:[ASP.NET]ユーザー・コントロールでパーソナライズ可能なWebパーツを作成するには?」でも紹介したように、コントロールをラッピングするGenericWebPartクラスのプロパティは、現バージョンのVisual Studio 2005(以降、VS 2005)では認識されない。つまり、プロパティ・ウィンドウからGenericWebPartクラスのプロパティを設定することはできないので、コード・エディタから直接に属性として追記する必要がある。コード・エディタでもエラーを表す緑色の波線が表示されるが、実行時には問題なく認識されるので、ここではこのエラーは無視して構わない。
2. Webパーツ表示時の挙動を定義する
フィルタ文字列を定義できたら、あとはフィルタ文字列とユーザー・ロールを比較して、要求するロールをカレント・ユーザーが所有しているかどうかを判定するだけだ。具体的なコードは以下のとおり。
|
|
カレント・ユーザーの所有する権限に従ってパーツの表示可否を判定(C#版:WebParts_cs.aspx) |
|
|
カレント・ユーザーの所有する権限に従ってパーツの表示可否を判定(VB版:WebParts_vb.aspx) |
上記のコードでポイントとなるのは、表示可否の判定をAuthorizeWebPartイベントの発生タイミングで行っているという点だ。WebPartManagerコントロールでは、ページ上に個々のWebパーツを出力するタイミングでAuthorizeWebPartイベントを発生する。本サンプルで、AuthorizeWebPartイベントに対応するイベント・ハンドラはmanager_AuthorizeWebPartメソッドだ。
AuthorizeWebPartイベント・ハンドラでは、第2パラメータに引き渡されるWebPartAuthorizationEventArgsオブジェクト(System.Web.UI.WebControls.WebParts名前空間)のAuthorizationFilterプロパティを介することで、現在ページに追加しようとしているWebパーツのフィルタ文字列(AuthorizationFilterプロパティ)を取得することができる。ここでは、該当のWebパーツに設定されたAuthorizationFilterプロパティが空でなく、かつ、カレント・ユーザーのロールとマッチしない場合に、WebPartAuthorizationEventArgs.IsAuthorizedプロパティをfalseに設定している。
IsAuthorizedプロパティは、現在のWebパーツがページに追加可能であるかどうか(承認済みであるかどうか)を表すプロパティで、本プロパティがfalseに設定された場合、Webパーツは未承認と見なされる(つまり、パーツはページに追加されない)というわけだ。
以上が理解できたら、さっそくadminロール、usrロール、それぞれの権限を持つユーザーでサンプル・アプリケーションにアクセスしてみよう。本稿冒頭のように、それぞれカレント・ユーザーが所有するロールが設定されたパーツ(とAuthorizationFilterプロパティが設定されていないパーツ)のみが表示されれば成功だ。
ちなみに、本サンプル・アプリケーションではAuthorizationFilterプロパティに単一のロール名を指定しているが、そもそも本プロパティの値には特別な制限は課せられていない。対応するAuthorizeWebPartイベント・ハンドラの判定ロジックさえ変更すれば、ユーザー名や複数のロール名、あるいは、カルチャ名などなど、フィルタの基準となる情報は自由に設定して構わない。
利用可能バージョン:.NET Framework 2.0のみ カテゴリ:Webフォーム 処理対象:WebPartsパーツ 使用ライブラリ:GenericWebPartクラス(System.Web.UI.WebControls.WebParts名前空間) 使用ライブラリ:WebPartAuthorizationEventArgsクラス(System.Web.UI.WebControls.WebParts名前空間) 関連TIPS:[ASP.NET]WebPartsコントロールでパーソナライズ・ページを構築するには? 関連TIPS:[ASP.NET]セキュリティ・コントロールでログイン機能を作成するには? 関連TIPS:[ASP.NET]ユーザー・コントロールでパーソナライズ可能なWebパーツを作成するには? |
![]() |
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
![]() |
|
|
|
![]() |