(Forms認証とInProc sessionstateを使用して)サイトを開発しているときに、Sessionに格納されている変数(Session ["myVar"]など)が失われるシナリオが頻繁に発生しますが、auth-sessionは有効なままです。
これにより、私のサイトで奇妙な動作が発生します。
なぜこれが発生するのでしょうか。また、認証変数とセッション変数のライフサイクルが異なるのを防ぐために何ができるでしょうか。
(Forms認証とInProc sessionstateを使用して)サイトを開発しているときに、Sessionに格納されている変数(Session ["myVar"]など)が失われるシナリオが頻繁に発生しますが、auth-sessionは有効なままです。
これにより、私のサイトで奇妙な動作が発生します。
なぜこれが発生するのでしょうか。また、認証変数とセッション変数のライフサイクルが異なるのを防ぐために何ができるでしょうか。
Asp.Netでは、セッションと「ログイン中」は同じものではありません。
どちらも(通常は)Cookieによって制御されますが、Cookieは別個のものです。
セッションが存続する期間を制御するには、による回答を参照してくださいJonas T
。
<forms ... />
ユーザーがログインし続ける時間を制御するには、要素でtimeOutを使用できます。
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx" timeout="120" slidingExpiration="true"/>
</authentication>
...
</system.web>
問題を取り除くには、セッションタイムアウトが少なくともフォーム認証タイムアウトと同じ長さであることを確認する必要があります。
フォーム認証(「Rememberme」)で永続的なCookieを許可している場合、保証はありません。その場合、いくつかの基準/仕様に従って、セッションタイムアウトを「十分に長い」に設定する必要があります。
編集:サイトが展開されているアプリケーションプール(IISの下)の設定も確認してください。そして、具体的には「Idle Time-out
」が何であるかを確認してください。これが低く設定されている場合(デフォルト値は20分だと思います)、その間に要求がない場合、IISはアプリケーションプールをシャットダウンします。これにより、(もちろん)インプロセスセッションが存在する場合はそれが終了します。
フォーム認証は、チケットをクライアント側のCookieまたはURL(Cookieが無効になっている場合)に保存します。
セッション変数は、有効期限が切れた状態でサーバー側に保存されます。変数をより永続的にしたい場合は、cookieを使用してください。
Web設定でセッションタイムアウトを延長できます。これは20分間です。
<configuration>
<system.web>
<sessionState timeout="20"></sessionState>
</system.web>
</configuration>
ASP.NETフォームの認証/承認を使用しているとのことですが、状態の代わりにプロファイルを使用することをお勧めします。Session