- - PR -
ASP.NET 3.5でのセッションタイムアウトを判定する場所について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2009-02-04 16:42
現在、マスターページを使用した下記のようなページを作成しています。
Base.master → Menu.master → Page.aspx つまりあるページはネストされた2つのマスターページを読み込んでいます。 該当のシステムはフォーム認証なので、Web.configで承認していなくても見られるページ、承認していないと見れないページを設定済みです。 ここで、セッションタイムアウトが発生した場合の処理を入れようとマスターページに書きました。 ところがページにリクエストがあった場合には、マスターページから処理するのではなくページから処理することにさっき気が付きました。。。(苦笑) つまり、下記のような感じ。 Page.aspx → Menu.master → Base.master → Web.configのセッションタイムアウト判定? そのため、Page.aspxのページロード時にセッションを使用した処理を記述していた場合に、オブジェクトインスタンスの生成が失敗するのでエラーで落ちてしまいます。 対応方法としては、 1. 全てのページのページロード時にセッションの存在確認を行ってセッションタイムアウトの処理をする。 2. ページロードでセッションを使用している箇所でセッションの存在確認を行って処理をスキップする 上記の2通りの方法を思いつきましたが、全ページに書く以外の方法はないのか?っと思いまして。 もし、「1か所に書くだけでOKなんですよ!」とかありましたら教えてください。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 2009-02-04 17:03
ASP.NET ページのライフ サイクルの概要
http://msdn.microsoft.com/ja-jp/library/ms178472(VS.80).aspx?ppud=4 | ||||||||||||
|
投稿日時: 2009-02-04 17:21
各ページが System.Web.UI.Page を継承するのではなく
System.Web.UI.Page を継承した自作クラスを継承するようにし、 その自作クラスで OnLoad を Overrides するのはどうでしょうか。 Overrides した OnLoad の中でセッションをチェックとか。 [ メッセージ編集済み 編集者: King 編集日時 2009-02-04 17:36 ] | ||||||||||||
|
投稿日時: 2009-02-04 17:53
todoさんが参考URLをあげてる意図がわかりにくいかな。
セッションチェックの処理が必要なPageのPreInitのタイミングでやればいいんじゃないかと。 | ||||||||||||
|
投稿日時: 2009-02-05 10:15
>todoさん、Kingさん、どっとねっとふぁんさん
回答ありがとうございます。 いや、ページのライフサイクルのページ大変勉強になりました。 どっとねっとふぁんさんのPreInitをヒントにいろいろと調べてわかりました。 ページで最初に発生するのはPage_Loadのみかと勝手に思いこんでいましたが、実はInit処理が入るわけですね。 マスターページにはPreInitが無い様なので、Initで考えた場合に処理の順番(必要な箇所のみ)は下記のようになると。 Base.masterのPage_Init → Menu.masterのPage_Init → Page.aspxのPage_Init → Page.aspxのPage_Load → Menu.masterのPage_Load → Base.masterのPage_Load なので、1箇所でセッションタイムアウトを判定するには下記のコードとなるわけですね。 ■Base.master
■Menu.master
■Page.aspx
上記のようにコーディングして、全てのページでBase.Masterを読み込ませればセッションタイムアウトの判定が1か所で出来るわけですね! 素晴らしい、できました。 じゃあweb.Configに書いているForms認証の認証処理はどのタイミングで発生しているんでしょう??? | ||||||||||||
|
投稿日時: 2009-02-05 10:34
> じゃあweb.Configに書いているForms認証の認証処理はどのタイミングで発生しているんでしょう???
これは、ページのライフサイクルじゃなく、その前提となるアプリケーションレベルのイベントで考える必要があります。 http://msdn.microsoft.com/ja-jp/library/system.web.httpapplication.aspx 承認(ユーザの確認)がAuthenticateRequest、認証(URLのアクセス権の確認)がAuthorizeRequestのタイミングで行われます。 ページのライフサイクルはあまり詳細に書いてないけど、こっちみてもらうほうが全体像はわかりやすいかな? http://dotnetfan.org/blogs/dotnetfanblog/archive/2007/06/18/2591.aspx | ||||||||||||
|
投稿日時: 2009-02-05 10:37
セキュリティ保護された ASP.NET アプリケーションの構築 : 認証、認定、および通信のセキュリティ保護 動作のしくみ
http://msdn.microsoft.com/ja-jp/library/cc465483.aspx このへんでしょうか。 | ||||||||||||
|
投稿日時: 2009-02-05 11:44
>どっとねっとふぁんさん、デューンさん
回答ありがとうございます。 どっとねっとふぁんBlogの「ASP.NET の仕組み 」の記事がとってもわかりやすい! これを見ると、ページ毎の処理より前に、認証、承認は行われているのですね。 っと言うことは、認証、承認はページ毎の処理より前に行われているけど、たとえ匿名ユーザー(セッションタイムアウトによるユーザー)でもページ毎の処理は実行されるということですかね? |