ASP.NET:如何检测身份验证超时

时间:2010-12-09 19:17:14

标签: asp.net forms session-timeout

我看过多篇文章,例如this one,解释了如何检测用户的会话已经超时。为清楚起见,这些文章指的是此web.config行定义的超时值:

<sessionState mode="InProc" cookieless="UseDeviceProfile" timeout="120" />

不要过多地使用该方法,但这涉及检查Session.IsNewSession是否为true以及会话cookie是否已存在。但我还没有看到任何关于如何检测身份验证超时的文章 - 这个web.config行定义的那个:

<authentication mode="Forms">
    <forms loginUrl="~/Home/Customer" timeout="60" name=".ASPXAUTH" requireSSL="false" slidingExpiration="true" defaultUrl="~/Home/Index" cookieless="UseDeviceProfile" enableCrossAppRedirects="false"/>
</authentication>

在线多篇文章,包括this SO post,都说您的会话超时值通常应该是身份验证超时值的两倍。所以现在,如上所述,我的会话是120,我的身份验证是60.这意味着我永远不会遇到会话超时的情况,但用户仍然是经过身份验证的;如果用户超时,则由于身份验证而非会话。

所以,和其他人一样,我对如何向用户报告他们的会话超时(但实际上是由于身份验证超时)感兴趣。有没有人知道如何实现这一目标,或任何可以指向我解决方案的在线资源?

3 个答案:

答案 0 :(得分:1)

这可能不是最佳方法,但这是我想到的。

登录时,在用户登录时记录会话标记中的时间戳。在每个后续请求(可能在global.asax BeginRequest?中)中,将此时间戳与当前时间进行比较,并将其与身份验证超时进行匹配(Scott Hanselman explains how to read it here)。

无论如何,这是我的“头脑”......

答案 1 :(得分:1)

我会在请求的早期利用http管道并发送适当的响应 我回答这些问题的来源是:

Professional ASP.NET 2.0 Security, Membership, and Role Management

HTTP模块可能会起到作用:

<强>的Web.config:

<configuration>
  <system.web>
    <httpModules>
      <add name="MyAuthModule" type="MyAssembly.Security.MyAuthModule, MyAssembly"/>

...

实际HTTP模块:

/// <summary>
/// A module for detecting invalid authentication 
/// </summary>
/// <remarks>See "How To Implement IPrincipal" in MSDN</remarks>
public class MyAuthModule : IHttpModule
{
    #region IHttpModule Members
    void IHttpModule.Dispose() { }
    void IHttpModule.Init(HttpApplication context)
    {
        context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
    }
    #endregion


    /// <summary>
    /// Inspect the auth request...
    /// </summary>
    /// <remarks>See "How To Implement IPrincipal" in MSDN</remarks>
    private void context_AuthenticateRequest(object sender, EventArgs e)
    {
        HttpApplication a = (HttpApplication)sender;
        HttpContext context = a.Context;

        // Extract the forms authentication cookie
        string cookieName = FormsAuthentication.FormsCookieName;
        HttpCookie authCookie = context.Request.Cookies[cookieName];

        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            // check if previously authenticated session is now dead
            if (authTicket != null && authTicket.expired)
            {
               // send them a Response indicating that they've expired.
            }
        }
    }
}
祝你好运!

答案 2 :(得分:1)

当您记录用户时,您可以在用户的​​计算机上删除一个cookie,表明他们有会话。当用户到达登录页面时(因为如果他们的会话过期,他们的登录也必须有),检查用户是否有该cookie以及他们是否拥有您希望他们拥有的任何会话密钥(如果这证明很难,只需在登录时设置会话变量即可。如果他们有cookie但没有会话密钥,那么他们的会话就会过期。