ASP.Net会话超时检测:Session.IsNewSession和SessionCookie检测是最好的方法吗?

时间:2009-01-09 06:49:50

标签: asp.net session timeout

当我的ASP.Net会话超时(并形成身份验证)并且我尝试点击页面时,我会自动重定向到我的默认login.aspx页面。

在页面加载之前,我需要确定这是否是超时情况,如果是 - 重定向到timeout.aspx。

以下文章指出,如果IsNewSession为true,并且存在sessionID cookie,则表示您有超时情况。

然而,在我的测试中,我遇到了我超时并尝试重新登录并且IsNewSession等于true并且sessionId cookie仍然闲置(因为它保留整个浏览器会话)的情况,因此它说我当我只是想重新登录时,我再次超时。

有没有更好的方法来做这一切?

技术被描述为herehere

在我的'global.asax'文件中,我有:

void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
        // Check if session state is enabled in web.config
        if (Context.Session == null) return;

        if (Session["user"] == null) 
        {
            if (Session.IsNewSession)
            {                    
                HttpCookie sessionCookie = Request.Cookies["ASP.NET_SessionId"];
                if ((null != sessionCookie) && !string.IsNullOrEmpty(sessionCookie.Value))
                {
                    /* Session Timeout! */
                    FormsAuthentication.SignOut(); //just in case not done yet
                    Session.Abandon();
                    Response.Redirect("timeout.aspx");
                }
                else
                {
                    // Cookie didn't exist - must be a brand new login
                    return;
                }
            }
            else
            {
                // If there is no session data and the session is not new then it must be the postback of the login screen.
                if ((HttpContext.Current.Request.Path.ToLower().LastIndexOf("/login.aspx") >= 0) && (Request.HttpMethod == "POST"))
                {
                    return;
                }
            }
        }    
}

2 个答案:

答案 0 :(得分:7)

您是要尝试区分超时会话和手动注销的会话?

你的问题是,由于会话数据已经消失所有你需要继续的是一个新的请求进入已经创建了一个新的会话,并且进来的请求带有一个会话ID cookie(表明它已经登录过)。

有两种方法。

<强>曲奇:

首先,在您的登录页面中,您可以创建一个指示用户登录状态的附加cookie。当用户手动注销时,cookie值被修改以指示注销。会话超时后的请求除了IsNewSession为真之外还会有一个登录状态cookie,显示用户仍然登录,从而表明用户没有手动选择退出。

<强>数据库:

第二种方法是将sessionID存储在DB表中以及登录状态。登录成功后,将sessionID输入LoggedOnSessions表。当用户手动注销时,从表中删除sessionID。因此,您的超时检测可以包括在表中查找会话ID(如果存在超时)(此时您可能应该删除ID)。

出于清洁目的,您应该包含一个到期日期时间字段,该字段的设置时间远远长于任何实际登录时间段(例如一周)。定期(例如,每周)删除表中已过期的条目。

我的偏好是我讨厌设置cookie的数据库方法,因为它让我觉得每次请求都会发送cookie但很少需要。

答案 1 :(得分:-1)

您也可以在身份验证标记下查看web.config文件。这应该是这样的:

<authentication mode="Windows">
  <forms defaultUrl="Default.aspx" loginUrl="Login.aspx" name=".aspxAuth">
  </forms>
</authentication>

注意属性 mode ,它可能在web.config文件中显示Forms而不是Window。在这种情况下,如果你丢失了你的会话,然后点击任何链接(让我们说SalesChart.aspx),ASP.NET将直接带你到Login.aspx代码隐藏而不是SalesChart.aspx代码隐藏,这是特别烦人的。

如果您尝试Windows模式,您将每次进入所请求的页面(SalesChart.aspx),然后自行决定会话丢失时采取的操作。