- PR -

【ASP.NET】Forms認証とGlobal.asaxのメソッドの関係

投稿者投稿内容
ロンロン
ベテラン
会議室デビュー日: 2004/01/08
投稿数: 58
お住まい・勤務地: TOKYO
投稿日時: 2005-11-19 14:08
ASP,NET Webアプリ C# VS.NET2003 .NetFramework1.1SP1

こんにちわ。

【実現したいこと】
参考元URLと似ていまして
「Forms認証後、特定のページにロールベースでの参照制約をかけたい」ということです。
Web.configには以下のような記述をしています。
 ※匿名ユーザを蹴散らすForms認証の機能自体は正しく動作しています

########【Web.config】################
:略;
<authentication mode="Forms">
 <forms loginUrl = "Login.aspx" timeout="10" />
</authentication>
:略;
<location path="Hogehoge.aspx">
 <system.web>
  <authorization>
   <allow roles="Hogehoge" />
   <deny users="*" />
  </authorization>
 </system.web>
</location>
#####################################


【問題点】
Identityとロール(string配列)を包含したGenericPrincipalを
Request.Context.Userにセットするタイミングについて。

Global.asaxクラスの
「Application_AuthenticateRequestメソッド」にてGenericPrincipalをセットすると
上記Web.Configに設定した<allow roles="Hogehoge" />の制約が効き、
Hogehogeロールを保持していれば、Hogehoge.aspxを表示する事ができます。
が、
「Application_PreRequestHandlerExecuteメソッド」にてGenericPrincipalをセットすると
タイミングが遅いため?か<deny users="*" />が効いてしまって
Hogehogeロールを保持しているにもかかわらず、認証ページ(Login.aspx)に飛ばされてしまいます。

?この動作の差異はASP.NETのフレームワークの仕様なのでしょうか?


【推測】
Application_AuthenticateRequestの処理
 ↓
<一連のForms認証機能が動く?>
 ↓
Application_PreRequestHandlerExecuteの処理
の順になっているように見えます。

MSDNを見るかぎり、そこまでの記述が無く裏が取れません。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemWebHttpApplicationClassTopic.asp


どなたか教えてください。プリーズ。。。

[ メッセージ編集済み 編集者: ロンロン 編集日時 2005-11-19 14:09 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-20 20:54
引用:

ロンロンさんの書き込み (2005-11-19 14:08) より:

【推測】
Application_AuthenticateRequestの処理
 ↓
<一連のForms認証機能が動く?>
 ↓
Application_PreRequestHandlerExecuteの処理
の順になっているように見えます。

MSDNを見るかぎり、そこまでの記述が無く裏が取れません。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemWebHttpApplicationClassTopic.asp


なんで?そうだって書いてあるけど?

引用:

アプリケーションは、global.asax ファイルで定義されているモジュールまたはユーザー コードで処理されるイベントを次の順序で実行します。

BeginRequest

AuthenticateRequest

AuthorizeRequest

ResolveRequestCache

[ハンドラ (要求 URL に対応するページ) がこの時点で作成されます]

AcquireRequestState

PreRequestHandlerExecute

[ハンドラが実行されます。]

PostRequestHandlerExecute

ReleaseRequestState

[応答フィルタが存在する場合は、出力をフィルタ処理します。]

UpdateRequestCache

EndRequest



Application_* って、Application オブジェクトで発生する、* イベントのハンドラメソッドですよ?
 つまり、Application_AuthenticateRequest は、AuthenticateRequest イベントハンドラ ですよ?
___________________________________________________________________
□ written by Jitta on 2005/11/20
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006

_________________
検索のコツ質問のコツ



やりたいことは、
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=26163&forum=7&1
こっちとセット?

[ メッセージ編集済み 編集者: Jitta 編集日時 2005-11-20 20:57 ]
ロンロン
ベテラン
会議室デビュー日: 2004/01/08
投稿数: 58
お住まい・勤務地: TOKYO
投稿日時: 2005-11-21 00:39
Jiitaさんありがとうございます。
こちらは私の読解力不足でした。そう書いてありますね。ごめんなさい。

以下、情報小出し&追加質問ですみません。

【最終的にやりたかった事】
一度ログイン認証(DBのマスタとチェック)してOKだった後は
生成したGenelicPrincipalをSessionに上げ、
リクエストの都度IdentityとRollを毎回DBから取得するのではなく
Global.asaxでカレントスレッドのPrincipalとリクエストのContext.Userにセットしようと考えてました。
 →レスポンスを考慮してこのような作りに。

【問題点】
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=26163&forum=7&2
↑こちらのスレでの結果を受けて、になりますが、
Application_AuthenticateRequestではセッションにさわれず、
かといって
Application_PreRequestHandlerExecuteにてPrincipalをセットしたのでは
Forms認証の機能とタイミングが合わない。(タイミングが遅い)
・・・という問題に直面してしまいました。

Principalをセッションに上げつつForms認証を併用する、という設計が悪いですか?
何か抜け道がないかと。。。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-21 18:41
引用:

ロンロンさんの書き込み(2005-11-21 00:39)より:

【最終的にやりたかった事】
一度ログイン認証(DBのマスタとチェック)してOKだった後は
生成したGenelicPrincipalをSessionに上げ、
リクエストの都度IdentityとRollを毎回DBから取得するのではなく
Global.asaxでカレントスレッドのPrincipalとリクエストのContext.Userにセットしようと考えてました。
 →レスポンスを考慮してこのような作りに。


 FormsAuthenticationTicket は、使用していないのでしょうか?GenericPrincipal クラスは Serializable なので、UserData にシリアル化してしまい込む、というのはどうでしょう?
___________________________________________________________________
□ written by Jitta on 2005/11/21
□ Microsoft MVP for Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________
ロンロン
ベテラン
会議室デビュー日: 2004/01/08
投稿数: 58
お住まい・勤務地: TOKYO
投稿日時: 2005-11-23 03:42
こんばんわ。Resサンクスです!

>>FormsAuthenticationTicketは、使用していないのでしょうか?
現在はログイン/ログアウト時に単にFormsAuthenticationクラスの
SetAuthCookieメソッドとSignOutメソッドにて認証チケットを
セッションクッキーで管理しているのみで、
FormsAuthenticationTicketクラスは利用していない状態です。
 →素直に言うと、、、このクラス自体初耳でした。。。

>>GenericPrincipal クラスは Serializable なので、
>>UserData にシリアル化してしまい込む、というのはどうでしょう?
おおお。内容が分かりませんが、ちと勉強して試してみます。

処理イメージとしては
→ログイン成功
 →GenelicPrincipal生成
  →FormsAuthenticationTicketクラスを作成し、UserDataにPrincipal格納?
   →レスポンスのクッキーにFormsAuthenticationTicketを追加
    →FormsAuthentication.SetAuthCookie()

   →以降、Global.asaxにて
    リクエストのクッキーよりUserDataからGenelicPrincipalを取り出し、
    Context.Userにセット?

みたいな感じでしょうか。
知識がおっついてないため、大至急触って試してみます。

[ メッセージ編集済み 編集者: ロンロン 編集日時 2005-11-23 03:45 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-23 09:15
http://www.atmarkit.co.jp/fdotnet/aspnet/index/index.html
19回あたりで
_________________
ロンロン
ベテラン
会議室デビュー日: 2004/01/08
投稿数: 58
お住まい・勤務地: TOKYO
投稿日時: 2005-11-23 22:16
ググりが甘くてすみません。19回にモロ載ってましたね。。。。
情報ありがとうございます。

該当の記事に則し、
認証クッキーのUserDataへロール情報の格納によるページ制御までは
サンプル実装で成功しました。

あとの課題は2点ほど残っておりますが、後日調べてみます。
@GenelicPlincipalのXMLシリアライズ&デシリアライズ
AWeb.Configのformsタグのアクセッサが提供されていない属性へのアクセス方法。
  →timeout属性など
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-23 22:24
引用:

ロンロンさんの書き込み (2005-11-23 22:16) より:

@GenelicPlincipalのXMLシリアライズ&デシリアライズ


http://www.atmarkit.co.jp/fdotnet/easyxml/index/index.html
第9回で。
_________________

スキルアップ/キャリアアップ(JOB@IT)