- - PR -
【ASP.NET】Forms認証とGlobal.asaxのメソッドの関係
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||
|
投稿日時: 2005-11-20 20:54
なんで?そうだって書いてあるけど?
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 ] | ||||||||
|
投稿日時: 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認証を併用する、という設計が悪いですか? 何か抜け道がないかと。。。 | ||||||||
|
投稿日時: 2005-11-21 18:41
FormsAuthenticationTicket は、使用していないのでしょうか?GenericPrincipal クラスは Serializable なので、UserData にシリアル化してしまい込む、というのはどうでしょう? ___________________________________________________________________ □ written by Jitta on 2005/11/21 □ Microsoft MVP for Visual Developer ASP/ASP.NET Oct.2005-Sept.2006 _________________ | ||||||||
|
投稿日時: 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 ] | ||||||||
|
投稿日時: 2005-11-23 09:15
http://www.atmarkit.co.jp/fdotnet/aspnet/index/index.html
19回あたりで _________________ | ||||||||
|
投稿日時: 2005-11-23 22:16
ググりが甘くてすみません。19回にモロ載ってましたね。。。。
情報ありがとうございます。 該当の記事に則し、 認証クッキーのUserDataへロール情報の格納によるページ制御までは サンプル実装で成功しました。 あとの課題は2点ほど残っておりますが、後日調べてみます。 @GenelicPlincipalのXMLシリアライズ&デシリアライズ AWeb.Configのformsタグのアクセッサが提供されていない属性へのアクセス方法。 →timeout属性など | ||||||||
|
投稿日時: 2005-11-23 22:24
http://www.atmarkit.co.jp/fdotnet/easyxml/index/index.html 第9回で。 _________________ |