表单身份验证超时与会话超时

Posted

技术标签:

【中文标题】表单身份验证超时与会话超时【英文标题】:Forms Authentication Timeout vs Session Timeout 【发布时间】:2010-12-01 01:02:51 【问题描述】:

在我的 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>

我有以下问题

    会话的超时值应该是多少,因为我在表单身份验证中使用滑动到期,因为会话将在表单身份验证之前到期。我该如何保护它?

    formauthentication 注销后,我想将页面重定向到 logout.aspx,但它会自动将我重定向到 loginpage.aspx。怎么可能?

【问题讨论】:

【参考方案1】:
    为了安全起见:TimeOut(Session) 如果您想在身份验证超时后显示 loginUrl 属性中指定的页面以外的页面,您需要手动处理此问题,因为 ASP.NET 不提供这样做的方法。

要实现 #2,您可以手动检查 cookie 及其 AuthenticationTicket 是否过期,如果它们已过期,则重定向到您的自定义页面。 您可以在其中一项活动中进行:AcquireRequestState、AuthenticateRequest。

事件中的示例代码如下所示:

// 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

【讨论】:

谢谢 Dmitriy,我的第二个问题:正如上面在
中所写,默认页面是“index.aspx”,登录是“login.aspx”。在我的仪表板页面登录后,当我保持理想状态 30 分钟(超时)之后,我点击任何链接,我将自动重定向到登录页面,并使用以下 URL localhost:/virtualdir/Pages/… 但在这里我想在我的注销页面重定向页面可以说一些注销信息
您确定要 Session.Timeout 条件ticket.Expiration &gt; DateTime.Now 是否正确?我认为它需要反过来,以便在当前 DateTime 大于表单身份验证票证到期时发生重定向。 同意多米尼克的观点。在清除会话时保持表单身份验证有一个有效的目的(这可能是大多数应用程序想要的方式)。但是,我有一个(安全的移动网络)应用程序,我想要的正好相反,并使用频繁的表单身份验证作为身份挑战。我希望此答案包含支持您建议的到期模型的理由或示例。 我对让表单身份验证晚于会话过期感到困惑。这对我来说没有意义,但这是另一个支持博客文章同意。还有一个指向试图重新执行该解决方案的 MSDN 文章的链接。 itworksonmymachine.wordpress.com/2008/07/17/…support.microsoft.com/kb/910439【参考方案2】:

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


这使得新会话 = 新身份验证,周期。

【讨论】:

这似乎很有说服力,但对我们来说是一个不错的选择,因为此时会议就位是必不可少的。 我不确定我是否称其为有力。它只是将会话身份验证状态结合在一起。当然,更强大的选择是在给定身份验证令牌的情况下恢复会话。但如果会话恢复是事后才想到的(即遍布各处),最简单的解决方案是让用户回到已知路径(登录)。 没错,这是我们所采取的路线,直到我们可以让会话在运行中重新创建自己。

以上是关于表单身份验证超时与会话超时的主要内容,如果未能解决你的问题,请参考以下文章

表单身份验证超时与sessionState超时

用户身份验证与会话身份验证有何不同

ASP.NET 窗体身份验证超时和会话超时

身份验证:JWT 使用与会话

asp.net cookie、身份验证和会话超时

代码中的.net Access Forms身份验证“超时”值