窗体身份验证超时与会话超时的相关问题

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (228)

在我的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。但怎么做到?
提问于
用户回答回答于
  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
}
用户回答回答于

对于具有会话依赖关系的站点,可以简单地使用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();
  }

}

扫码关注云+社区

领取腾讯云代金券