- PR -

ASP.NET 3.5でのセッションタイムアウトを判定する場所について

投稿者投稿内容
toto
常連さん
会議室デビュー日: 2005/10/18
投稿数: 46
お住まい・勤務地: 岡山
投稿日時: 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なんですよ!」とかありましたら教えてください。

よろしくお願いします。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2009-02-04 17:03
ASP.NET ページのライフ サイクルの概要
http://msdn.microsoft.com/ja-jp/library/ms178472(VS.80).aspx?ppud=4
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-04 17:21
各ページが System.Web.UI.Page を継承するのではなく
System.Web.UI.Page を継承した自作クラスを継承するようにし、
その自作クラスで OnLoad を Overrides するのはどうでしょうか。
Overrides した OnLoad の中でセッションをチェックとか。

[ メッセージ編集済み 編集者: King 編集日時 2009-02-04 17:36 ]
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2009-02-04 17:53
todoさんが参考URLをあげてる意図がわかりにくいかな。
セッションチェックの処理が必要なPageのPreInitのタイミングでやればいいんじゃないかと。
toto
常連さん
会議室デビュー日: 2005/10/18
投稿数: 46
お住まい・勤務地: 岡山
投稿日時: 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
コード:
'1番目
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    'セッションタイムアウトの処理を書く
End Sub

'6番目
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    '処理
End Sub



■Menu.master
コード:
'2番目
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    '処理
End Sub

'5番目
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    '処理
End Sub



■Page.aspx
コード:
'3番目
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    '処理
End Sub

'4番目
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    'セッションを使用する処理を書く
End Sub



上記のようにコーディングして、全てのページでBase.Masterを読み込ませればセッションタイムアウトの判定が1か所で出来るわけですね!
素晴らしい、できました。

じゃあweb.Configに書いているForms認証の認証処理はどのタイミングで発生しているんでしょう???
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 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
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-05 10:37
セキュリティ保護された ASP.NET アプリケーションの構築 : 認証、認定、および通信のセキュリティ保護 動作のしくみ
http://msdn.microsoft.com/ja-jp/library/cc465483.aspx

このへんでしょうか。
toto
常連さん
会議室デビュー日: 2005/10/18
投稿数: 46
お住まい・勤務地: 岡山
投稿日時: 2009-02-05 11:44
>どっとねっとふぁんさん、デューンさん

回答ありがとうございます。

どっとねっとふぁんBlogの「ASP.NET の仕組み 」の記事がとってもわかりやすい!
これを見ると、ページ毎の処理より前に、認証、承認は行われているのですね。
っと言うことは、認証、承認はページ毎の処理より前に行われているけど、たとえ匿名ユーザー(セッションタイムアウトによるユーザー)でもページ毎の処理は実行されるということですかね?

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