web-dev-qa-db-ja.com

フォーム認証タイムアウトとセッションタイムアウト

私のasp.netウェブサイトでは、次の構成でasp.netフォーム認証を使用しています

<authentication mode="Forms">
    <forms loginUrl="~/Pages/Common/Login.aspx"
           defaultUrl="~/Pages/index.aspx"
           protection="All"
           timeout="30"
           name="MyAuthCookie"
           path="/"
           requireSSL="false"
           cookieless="UseDeviceProfile"
           enableCrossAppRedirects="false" >
    </forms>
</authentication>

次の質問があります

  1. フォーム認証の前にセッションが期限切れになるため、フォーム認証内でスライド式の有効期限を使用しているため、セッションのタイムアウト値はどうなりますか?どうすればそれを保護できますか?

  2. フォーム認証のログアウト後、logout.aspxでページをリダイレクトしたいのですが、loginpage.aspxで自動的にリダイレクトされます。どうして可能ですか?

59
Hemant Kothiyal
  1. 安全のために:TimeOut(Session)<= TimeOut(FormsAuthentication)* 2
  2. 認証タイムアウト後にloginUrl属性で指定された以外のページを表示する場合は、ASP.NETがそれを行う方法を提供しないため、これを手動で処理する必要があります。

#2を達成するには、CookieとそのAuthenticationTicketの有効期限を手動で確認し、有効期限が切れている場合はカスタムページにリダイレクトします。
次のいずれかのイベントで実行できます: AcquireRequestStateAuthenticateRequest

イベントのサンプルコードは次のようになります。

// Retrieve AuthenticationCookie
var cookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie == null) return;
FormsAuthenticationTicket ticket = null;
try {
    ticket = FormsAuthentication.Decrypt(cookie.Value);
} catch (Exception decryptError) {
    // Handle properly
}
if (ticket == null) return; // Not authorised
if (ticket.Expiration > DateTime.Now) {
    Response.Redirect("SessionExpiredPage.aspx"); // Or do other stuff here
}
50

セッション依存関係があるサイトの場合、global.asaxのセッション開始イベントを使用して、古い認証から簡単にサインアウトできます。

void Session_Start(object sender, EventArgs e)
{
  if (HttpContext.Current.Request.IsAuthenticated)
  {

    //old authentication, kill it
    FormsAuthentication.SignOut();
    //or use Response.Redirect to go to a different page
    FormsAuthentication.RedirectToLoginPage("Session=Expired");
    HttpContext.Current.Response.End();
  }

}

これにより、新しいセッション=新しい認証、期間になります。

24
b_levitt