.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パーツに対して、フィルタリングのキーとなる文字列(この場合はアクセスを認めるロール名)を指定する必要がある。コード・エディタからそれぞれ以下のようにプロパティを追加してみよう(太字が追記個所)。

<asp:Calendar ID="cal" runat="server"
  AuthorizationFilter="admin"></asp:Calendar>
  ……中略……
<asp:Image ID="img" runat="server"
  ImageUrl="http://www.wings.msn.to/image/wings.jpg"
  AuthorizationFilter="usr" />
個々の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パーツ表示時の挙動を定義する

 フィルタ文字列を定義できたら、あとはフィルタ文字列とユーザー・ロールを比較して、要求するロールをカレント・ユーザーが所有しているかどうかを判定するだけだ。具体的なコードは以下のとおり。

protected void manage_AuthorizeWebPart(object sender, WebPartAuthorizationEventArgs e){
  // WebパーツにAuthorizationFilterプロパティが指定されているか
  if (!String.IsNullOrEmpty(e.AuthorizationFilter)) {

    // AuthorizationFilterプロパティで指定されたロールを
    // ユーザーが所有しているか
    if (!User.IsInRole(e.AuthorizationFilter)) {

      // パーツが要求する権限をカレント・ユーザーが持たない場合、
      // 認証を拒否
      e.IsAuthorized = false;
    }
  }
}
カレント・ユーザーの所有する権限に従ってパーツの表示可否を判定(C#版:WebParts_cs.aspx)
 
Protected Sub manager_AuthorizeWebPart(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.WebParts.WebPartAuthorizationEventArgs) Handles manager.AuthorizeWebPart
  ' WebパーツにAuthorizationFilterプロパティが指定されているか
  If Not String.IsNullOrEmpty(e.AuthorizationFilter) Then

    ' AuthorizationFilterプロパティで指定されたロールを
    ' ユーザーが所有しているか
    If Not User.IsInRole(e.AuthorizationFilter) Then

      ' パーツが要求する権限をカレント・ユーザーが持たない場合、
      ' 認証を拒否
      e.IsAuthorized = False
    End If
  End If
End Sub
カレント・ユーザーの所有する権限に従ってパーツの表示可否を判定(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イベント・ハンドラの判定ロジックさえ変更すれば、ユーザー名や複数のロール名、あるいは、カルチャ名などなど、フィルタの基準となる情報は自由に設定して構わない。End of Article

利用可能バージョン:.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
[ASP.NET]ユーザー・コントロールでパーソナライズ可能なWebパーツを作成するには?
[ASP.NET]WebPartsコントロールでパーソナライズ・ページを構築するには?
[ASP.NET]WebPartsコントロールでページ内のコンテンツを編集/再配置するには?
[ASP.NET]DeclarativeCatalogPartコントロールでコンテンツ・カタログを定義するには?
[ASP.NET]ImportCatalogPartコントロールでパーツ情報をページにインポートするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間