|
.NET TIPS [ASP.NET]ページ単位にユーザーのアクセス可否を制御するには?山田 祥寛2004/07/02 |
![]() |
|
|
|
別稿「TIPS:[ASP.NET]構成ファイルの適用範囲を限定するには?」では、ファイルごとに異なるアクセス制限を設定する方法を紹介した。しかし、web.configの設定をご覧になれば容易に想像できるように、<location>要素の記述は極めて煩雑で、時として構成ファイルの保守性を劣化させる原因となる。
そのため、もしページ単位またはユーザー単位にアクセスの可否を綿密に制御したいという場合には、データベース・サーバで権限情報を管理する方がより好ましい。本稿では、ユーザーの権限とページ・アクセスに必要な権限をデータベースに格納しておき、ページがアクセスされたときにそれらを比較することによりアクセスを制御する方法を紹介する。
なお、データベース・サーバを用いたユーザー管理については、別稿「TIPS:[ASP.NET]フォーム認証のユーザー管理をデータベース・サーバで行うには?」で紹介しているので、こちらも併せて参照していただきたい。本稿では、その設定(データベースによるフォーム認証のユーザー管理)がすでになされていることを前提に、追加部分の機能についてのみ紹介する。
1. アクセス管理用のテーブルを定義する
本稿のサンプル・コード(後述)を動作させるには、データベース上に、あらかじめ以下のようなアクセス管理用の「authテーブル」を定義しておく必要がある。
| フィールド名 | データ型 | 概要 |
| url | VARCHAR(100) | ページのURL(主キー) |
| role | VARCHAR(100) | ページが要求する権限(複数ある場合には、カンマ区切り) |
| authテーブルのフィールド・レイアウト | ||
| 本稿のサンプル・コード(後述)を動作させるには、データベース上に、あらかじめアクセス管理用の「authテーブル」を定義しておく必要がある。 | ||
authテーブルには仮に以下のようなデータが含まれているものとする。urlフィールドには、仮想ディレクトリ上での絶対パスの形式で指定する。
| urlフィールド | roleフィールド |
| /netIns/auth/db_read_cs.aspx | admin,super |
| /netIns/auth/db_read_vb.aspx | usr |
| authテーブルのサンプル・データ | |
2. アクセス・チェックの方法を定義する
アクセス・チェックの仕組みは、認証が完了したタイミングで発生するGlobal.asaxのApplication_OnAuthorizeRequestイベント・ハンドラに実装する。(当然ではあるが)Application_OnAuthorizeRequest以前に呼び出されるイベント・ハンドラからは認証済みユーザーに関する情報にはアクセスできないので、注意すること。
Global.asaxに関する詳細は、別稿「TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(Global.asax編)」で紹介しているので、併せて参照するとよいだろう。
|
|
| 認証済みユーザーのアクセス・チェックを行うGlobal.asax(C#版) |
|
|
| 認証済みユーザーのアクセス・チェックを行うGlobal.asax(VB.NET版) |
ここで行っているアクセス・チェックの仕組みそのものは、ごく単純だ。カレント・ユーザー名をキーにusrテーブルから取得した権限情報(roleフィールド)を、authテーブルに含まれる該当URLの権限情報と比較すればよい。もしもauthテーブルにカレント・ページの情報が存在しない場合には、認証済みの全ユーザーがアクセス可能であると見なすこととする。
カレント・ユーザーの権限が、ページが要求する権限を満たしていれば、そのままリクエスト処理を継続するが、もしもカレント・ユーザーの権限がページ権限に合致しない場合には、HttpResponse.StatusCodeプロパティで403(Forbidden)をセットする。これによって、権限を持たないユーザーに対しては、以下のようなエラー・ページが表示されるようになる。
![]() |
| 権限を持たないユーザーがページにアクセスした場合のエラー・ページの表示 |
このエラー・ページにより、アクセス禁止の旨をユーザーに通知することができる。![]()
| カテゴリ:Webフォーム 処理対象:認証 関連TIPS:[ASP.NET]構成ファイルの適用範囲を限定するには? 関連TIPS:[ASP.NET]フォーム認証のユーザー管理をデータベース・サーバで行うには? 関連TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(Global.asax編) |
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -



