クイックハック:
フォームのタイムアウトより 2 分後にセッションを設定します。これにより、認証が終了した瞬間にセッションが終了しないことが保証されます。ただし、詳細については、セッションはフォームから独立していることを忘れないでください (このブログを参照)。
<system.web>
<authentication mode="Forms">
<forms timeout="20" loginUrl="-- Login Page here --"/>
</authentication>
<sessionState mode="InProc" timeout="22"/>
</system.web>
より深い調査:
具体的にどれがタイムアウトしているかを調べてみます。これはかなり簡単なテストであり、かなりの時間を節約できます。
したがって、必要なセクションは、タイムアウトが 1 分間、セッションが 10000 のセクションです。
<system.web>
<authentication mode="Forms">
<forms timeout="1" loginUrl="-- Login Page here --"/>
</authentication>
<sessionState mode="InProc" timeout="10000"/>
</system.web>
ログインしてページを参照し、1 分待ってからサイトを更新すると、ログイン ページが表示されます。
お気に入りのブラウザーで開発者ツールバーを開き、このサイト用に保存されている Cookie を参照します。2 つの Cookie があるはずです。
ASP.NET_SessionId
- セッションを追跡する
.ASPXAUTH
- ログインを追跡するため (有効期限が切れたためにブラウザーが削除した場合を除く)
セッション ( ASP.NET_SessionId
) の有効期限は将来ですが、フォーム ( .ASPXAUTH
) は有効期限が切れています。
再度ログインすると、セッションは以前と同じになります。
設定を逆にすると、逆のことが起こっていることがわかるはずです。つまり、長時間ログインしているにもかかわらず、リセットされています。
セッション終了イベントのトレース
もう 1 つ試すことができるのは、グローバル ASAX です。sessionMode='InProc'
web.config にあることを確認し、メソッドを追加します。
// Only works with sessionMode='InProc'
protected void Session_End(object sender, EventArgs e)
{
if(Debugger.IsAttached)
Debugger.Break();
}
セッションが終了すると、ブレークポイントがヒットします。コール スタックを介して、有効期限が切れた正確な理由を突き止めることができる場合があります。これは、コードが呼び出すときにSession.Abandon()
も発生する可能性があります。