特集:Visual Studio 2008&ASP.NET 3.5

ASP.NETアプリ開発者のためのVisual Studio 2008新機能 Part IV

山田祥寛(http://www.wings.msn.to/
2008/04/11
Page1 Page2 Page3

ロール・アクセスに対応したアプリケーションサービス・ブリッジ

 ASP.NET AJAX Extensionsというと、UpdatePanel/UpdateProgressコントロールのようなサーバ・コントロールの方に目が向きがちであるが、忘れてならない重要な機能が「ブリッジ機能」だ。

 ブリッジ機能とは、名前のとおり、ASP.NETのメンバシップ・フレームワークやXML Webサービスをクライアントサイド・スクリプトからアクセス可能にするための仲介役(=ブリッジ)となるものだ。

図2 ASP.NET AJAXのブリッジ機能の仕組み

 ブリッジ機能を利用することで、XMLHttpRequestオブジェクトなどの原始的な通信の手続きを意識することなく、クライアントサイドからサーバ上で定義されたメソッド(やサービス)を呼び出すことができる。UpdatePanelコントロールのような手軽さこそ損なわれるものの、その分、UpdatePanel固有の制約に悩まされることなく、かつ、アプリケーション固有の要件にも柔軟に対応しやすいというメリットがある。(当たり前のことではあるが)ASP.NET AJAXを利用する場合、UpdatePanelコントロールとブリッジ機能のいずれか片方を、というのではなく、それぞれの局面に応じて使い分けていくのが好ましい。

 さて、そのブリッジ機能の中でも、ASP.NETが標準で提供するメンバシップ・フレームワークにアクセスする機能のことを「アプリケーションサービス・ブリッジ機能」と呼ぶ。ASP.NET AJAX 1.0(+ASP.NET 2.0)において、アプリケーションサービス・ブリッジ機能でアクセスできるのは認証/プロファイル情報に限られていたが、ASP.NET 3.5ではロール情報にもアクセスできるようになった。

 以下に、ロール情報へのアクセスのための具体的な手順を見ていくことにしよう。ここで紹介するのはごくシンプルなサンプル――ユーザーが所属するロールに応じて、メッセージと背景色を切り替えるものだ。




図3 ユーザーが所属するロールに応じて、メッセージと背景色を切り替え
上がadminロールを持つyyamadaユーザーでアクセスした場合、下がuserロールを持つnkakeyaユーザーでアクセスした場合。

 なお、以前から提供されていたアプリケーションサービス・ブリッジ機能に関する詳細については、以下の別稿も併せて参照することをお勧めする。

[1]メンバシップ・フレームワークに関する設定を行う

 繰り返しになるが、アプリケーションサービス・ブリッジ機能は、あくまでASP.NET標準のメンバシップ・フレームワークに対してクライアントサイド・スクリプト(JavaScript)からアクセスするための橋渡し(ブリッジ)役を務めるものにすぎない。つまり、アプリケーションサービス・ブリッジ機能による認証機能を利用するには、まずASP.NET側でメンバシップ・フレームワークを利用するための準備を済ませておく必要があるということだ。

 メンバシップ・フレームワークを利用するための手順については、「.NET TIPS:[ASP.NET]セキュリティ・コントロールでログイン機能を作成するには?」が詳しいので、そちらを参照していただきたい。

 本稿では、取りあえずadminロールに属するユーザー「yyamada」、userロールに属するユーザー「nkakeya」が用意されている前提で、以降の解説を進めていく。

[2]ASP.NET AJAXで認証サービスを有効にする

 まず、ASP.NET AJAX上でアプリケーションサービス・ブリッジ(ロール・サービス)を利用できるよう、アプリケーション構成ファイル(Web.config)を編集する必要がある。

<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  ……中略……
  </system.Web>
  <system.Web.extensions>
    <scripting>
      <webServices>
        ……中略……
        <authenticationService enabled="true" requireSSL="false" />
       <roleService enabled="true"/>
        ……中略……
      </webServices>
      ……中略……
    </scripting>
  </system.Web.extensions>
  ……中略……
</configuration>
リスト1 ASP.NET AJAXによるロール・アクセスを有効にするための設定(Web.config)
<roleService>要素によってロール・サービスの有効/無効を指定する。

 ロール・サービスの有効/無効を決めるのは、<roleService>要素の役割であり、enabled属性にtrueを指定した場合、ロール・サービスは有効化される。

[3]新規のWebフォームを作成する

 以上で、ASP.NET AJAX上で認証サービスを利用するための準備は完了だ。ここからは、具体的に認証を行うためのフォームを作成してみよう。

 新規のWebフォーム(Role.aspx)を作成したら、フォーム・デザイナから以下の画面4の要領でコントロールを配置する。

図4 Role.aspxのフォーム・レイアウト
  ScriptManagerコントロール(manager)
  Divタグ(result)

 ScriptManagerコントロールはASP.NET AJAXの動作に必要なJavaScriptライブラリを出力/管理するためのコントロール、<Div>タグは、クライアントサイド・スクリプトで生成したコンテンツを出力するための領域を定義するための要素である。

[4]ロール情報にアクセスするためのクライアントサイド・スクリプトを記述する

 後は、ページ・ロード時に実行されるクライアントサイド・スクリプトを記述するだけだ。pageLoad関数は、Microsoft AJAX Libraryであらかじめ予約された関数の1つで、名前のとおり、ページ・ロード時に呼び出される処理を規定する。

<script type="text/javascript">

function pageLoad() {

  // サービス側からのロール情報の読み込み
  Sys.Services.RoleService.load(

    // 読み込み成功時のコールバック関数
    function(roles){

      // カレント・ユーザーが所属するロール名を表示
      $get('result').innerHTML =
        String.format('あなたの権限は{0}です。',roles[0]);

      // カレント・ユーザーが所属するロールに応じて背景色を変更
      switch (roles[0]) {
        case "admin" :
          document.bgColor = '#cccc66';
          break;
        case "user" :
          document.bgColor = '#99ccff';
          break;
      }
    }
  );
}
</script>
リスト2 ロール・アクセスのための処理を定義したJavaScriptのコード(Role.aspx)

 アプリケーションサービス・ブリッジ機能において、ASP.NETが提供するロール・サービスにアクセスするのは、Sys.Services.RoleServiceオブジェクトの役割だ。

 RoleServiceオブジェクトはAJAX Libraryで提供されるJavaScriptのオブジェクトで、いわゆるロール情報へのアクセスに特化したプロキシ・クラスと思っていただいてもよいだろう(プロキシ・クラスについては、「.NET TIPS:[ASP.NET AJAX]クライアントサイド・スクリプトからXML Webサービスを非同期呼び出しするには?(クライアントサイド編)」を参照)。

 以下に、RoleServiceオブジェクトで公開されているメンバをまとめておく。

メンバ 概要
[M]load 認証ユーザーのロールを読み込み(構文は後述)
[M]IsUserInRole(role) カレント・ユーザーが指定ロールに属しているか
[F]DefaultWebServicePath 既定のロール・サービスのパス
[P]defaultLoadCompletedCallback デフォルトの完了コールバック
[P]defaultSucceededCallback デフォルトの成功コールバック
[P]defaultFailedCallback デフォルトの例外コールバック
[P]defaultUserContext デフォルトのユーザー・コンテキスト
[P]path ロール・サービスへのパス
[P]roles カレント・ユーザーのロール情報(配列。読み取り専用)
[P]timeout ロール問い合わせのタイムアウト時間(ミリ秒)
Sys.Services.RoleServiceオブジェクトの主なメンバ
[F]はフィールド、[P]はプロパティ、[M]はメソッド。プロパティを参照/設定するには、プロパティ名について直接ではなく、「オブジェクト名.get_プロパティ名()」「オブジェクト名.set_プロパティ名(設定値)」のように、アクセサ・メソッド経由でアクセスしなければならない点に注意。なお、IsUserInRoleメソッド、rolesプロパティにアクセスするには、あらかじめloadメソッドでロール情報を読み込んでおく必要がある。

 pageLoad関数から呼び出されるloadメソッドの構文はやや複雑であるので、以下に詳しく示しておくことにしよう。

Sys.Services.RoleService.load(
  成功コールバック,
  例外コールバック,
  コンテキスト値
)
RoleServiceオブジェクトのloadメソッドの構文

 成功/例外コールバックやコンテキスト値などについては、「.NET TIPS:[ASP.NET AJAX]クライアントサイド・スクリプトからXML Webサービスを非同期呼び出しするには?(クライアントサイド編)」で紹介したとおりである。成功コールバックは、引数としてカレント・ユーザーのロール情報を受け取るので、ここではロールに応じて処理を分岐している(ロール情報の読み込みには、Sys.Services.RoleServiceオブジェクトのrolesプロパティを利用しても構わない)。

 なお、ここでは簡略化のために、それぞれのユーザーが常に1つのロールにのみ属していることを前提にしているので、リスト2では配列rolesの0番目の要素を無条件に参照している。しかし、実際には1人のユーザーが複数のロールに属することもあり得るので、その場合には、引数として受け取った配列rolesの1番目以降の要素も確認する必要があるので、注意されたい。

 以上で、ロール・サービスを利用するための手順は完了だ。作成したサンプル・プログラムを実行し、実際の動作を確かめてみよう。本節冒頭の図3のように、admin、userロールそれぞれのユーザーに応じて、表示されるメッセージと背景色とが切り替わっていれば成功である。


 INDEX
  Visual Studio 2008&ASP.NET 3.5
  ASP.NETアプリ開発者のためのVisual Studio 2008新機能 Part I
    1.JavaScriptサポートを大幅に強化
    2.外部のJavaScriptライブラリやサービス・メソッドも認識可能
    3.サービス・メソッドを利用する場合/自作ライブラリにもツール・ヒントを表示
    4.機能強化されたJavaScriptのデバッグ機能
 
  ASP.NETアプリ開発者のためのVisual Studio 2008新機能 Part II
    1.CSSサポートもますます使いやすく(1)
    2.CSSサポートもますます使いやすく(2)
    3.マルチターゲッティング機能/分割ビュー
    4.マスタ・ページのネスト機能/エクステンダ・ウィザード
 
  ASP.NETアプリ開発者のためのVisual Studio 2008新機能 Part III
    1.新しいデータアクセス・コントロール − ListViewコントロール −(1)
    2.新しいデータアクセス・コントロール − ListViewコントロール −(2)
    3.より柔軟なページャの配置を可能にする − DataPagerコントロール −
    4.ASP.NETページでLINQ機能を利用する − LinqDataSourceコントロール −
 
  ASP.NETアプリ開発者のためのVisual Studio 2008新機能 Part IV
    1.UpdatePanelコントロールの適用範囲が拡大
  2.ロール・アクセスに対応したアプリケーションサービス・ブリッジ
    3.Webサービス・ブリッジがWCFをサポート


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 記事ランキング

本日 月間