当我的ASP.Net会话超时(并形成身份验证)并尝试点击页面时,我会自动重定向到我的默认login.aspx页面.
在页面加载之前,我需要确定这是否是超时情况,如果是 - 重定向到timeout.aspx.
下面的文章指定如果IsNewSession为true,并且存在sessionID cookie,那么您将遇到超时情况.
但是在我的测试中,我遇到了我超时的情况并尝试重新登录并且IsNewSession等于true并且sessionId cookie仍然处于闲置状态(因为它保留整个浏览器会话),因此它说我已经定时了当我只是想重新登录时再次出现.
有没有更好的方法来做这一切?
技术是描述下这里和这里.
在我的'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; } } } }
AnthonyWJone.. 7
您是要尝试区分超时会话和手动注销的会话?
您的问题是,由于会话数据消失了,您只需要进入的新请求创建了一个新会话,并且进入的请求带有会话ID cookie(表示它之前已登录).
有两种方法.
曲奇饼:
首先在登录页面中,您可以创建一个指示用户登录状态的附加cookie.当用户手动注销时,cookie值被修改以指示注销.会话超时后的请求除了具有IsNewSession
true之外还将具有登录状态cookie,显示用户仍然登录,从而表示用户没有手动选择退出.
数据库:
第二种方法是将sessionID存储在DB表中以及登录状态.登录成功后,将sessionID输入LoggedOnSessions表.当用户手动注销时,从表中删除sessionID.因此,您的超时检测可以包括查找表中的会话ID(如果存在超时)(此时您也应该删除ID).
出于清洁目的,您应该包含一个到期日期时间字段,其设置的时间比任何实际登录时间(例如一周)长得多.定期(例如,每周)删除表中已过期的条目.
我的偏好是数据库方法我讨厌设置cookie,因为它让我觉得每次请求都会发送cookie但很少需要.
您是要尝试区分超时会话和手动注销的会话?
您的问题是,由于会话数据消失了,您只需要进入的新请求创建了一个新会话,并且进入的请求带有会话ID cookie(表示它之前已登录).
有两种方法.
曲奇饼:
首先在登录页面中,您可以创建一个指示用户登录状态的附加cookie.当用户手动注销时,cookie值被修改以指示注销.会话超时后的请求除了具有IsNewSession
true之外还将具有登录状态cookie,显示用户仍然登录,从而表示用户没有手动选择退出.
数据库:
第二种方法是将sessionID存储在DB表中以及登录状态.登录成功后,将sessionID输入LoggedOnSessions表.当用户手动注销时,从表中删除sessionID.因此,您的超时检测可以包括查找表中的会话ID(如果存在超时)(此时您也应该删除ID).
出于清洁目的,您应该包含一个到期日期时间字段,其设置的时间比任何实际登录时间(例如一周)长得多.定期(例如,每周)删除表中已过期的条目.
我的偏好是数据库方法我讨厌设置cookie,因为它让我觉得每次请求都会发送cookie但很少需要.