【ASP.NET MVC】【ASP.NET Identity】セッション変数の有効期限をログインの有効期限と合わせる
ASP.NET MVC/ASP.NET Identityを使用してログインを行うウェブアプリで、かつセッション変数を利用する場合、セッション変数の有効期限とログインの有効期限は別に管理されており、有効期限を正しく管理していないと、ログインがタイムアウトしてもセッション変数は残っていたり、ログイン中でもセッション変数がタイムアウトになってセッション変数が使えなくなったりする。
IISの場合、デフォルトのセッションタイムアウト時間は20分と短くなっている。
対策として、以下のようにした。
※ログイン前にはセッション変数は使用しないということが前提
- ログインはSlidingExpirationをtrueにし、最後にアクセスしてから一定時間有効とする
- セッション変数の有効期限をASP.NET Identityのログインの有効期限と同じにする
- ログオフした場合、セッション変数を破棄する
まず、ASP.NETではセッション変数はアクセスするごとに有効期限が延びる。すなわち最後にアクセスしてから一定時間有効となっている。
そこで、1.でログインの有効期限についても、最後にアクセスしてから一定時間有効に設定する。
そして、2.でセッション変数の有効時間とログインの有効期限を同じすることで、セッション変数がタイムアウトする=ログインもタイムアウトする、という状況にする
最後に、3.でタイムアウトにならずにログオフした場合に、セッション変数も破棄しておくことで、セッション変数が残ったままにならないようにする。
具体的な設定方法は下記の通り。
- App_Startフォルダ→Startup.Auth.csのStartupクラス
public void ConfigureAuth(IAppBuilder app)
{
//~前略~
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
ExpireTimeSpan = TimeSpan.FromMinutes(120),//ログインの有効期限
SlidingExpiration = true,//アクセスごとにログインの有効期限を延長するかどうか
//~後略~
- Web.Config
<configuration>
<!--~中略~-->
<system.web>
<!--~中略~-->
<!--セッション変数の有効期限を設定-->
<sessionState mode="InProc" timeout="120" />
<!--~後略~-->
- ログアウト時のAction
public ActionResult LogOut()
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
//セッションを破棄(セッションIDもクリア)
context.HttpContext.Session.RemoveAll();
context.HttpContext.Session.Abandon();
context.HttpContext.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
}
- IISの設定①
- IISマネージャを開き、左ペインから「アプリケーションプール」をクリック
- 発行したウェブアプリが使用されているアプリケーションプールを右クリック→「詳細設定」
- 「プロセスモデル」の詳細を開き、「アイドル状態のタイムアウト(分)」の値をログインの有効時間と同じにする
以下はWeb.configのほうで設定しているため、設定しなくてもいいはずであるが、念のため設定しておくと安心
- IISの設定②
- IISマネージャを開き、左ペインから「サイト」の詳細を開き、発行したウェブアプリのサイトをクリック
- 中央ペインのASP.NETの中の「セッション状態」をクリック
- Cookieの設定の項目の「タイムアウト(分)」をログインの有効時間と同じにする
設定が終わったら必ず意図通りに動いているか、確認してください。
なお、ログイン前にセッション変数を使用する場合は、ログイン後に使用するセッション変数の変数名を特定し、3.で破棄するセッション変数をログイン後に使用するもののみにしておけばよいと思う。