Asp.Net:关闭并重新打开浏览器实例后保留旧的浏览器会话
Posted
技术标签:
【中文标题】Asp.Net:关闭并重新打开浏览器实例后保留旧的浏览器会话【英文标题】:Asp.Net: Retaining the old browser session after closing and reopening browser instance 【发布时间】:2013-07-22 10:44:34 【问题描述】:有没有办法在用户关闭浏览器然后重新打开后保留浏览器会话。
asp.Net 中的默认行为是将 Asp.Net SessionId 保存在浏览器 cookie 中,当我们关闭浏览器时 过期。在 reopen 浏览器 asp.net 会生成一个新的 SessionId,即使旧会话在服务器端没有过期,我们也无法保留它。
我们可以在 Asp.Net 中控制 session cookie 的过期行为吗?
【问题讨论】:
如果你设置了cookie的过期时间,不能解决你的问题吗?例如:Response.Cookies["userName"].Value = "test"; Response.Cookies["userName"].Expires = DateTime.Now.AddDays(1);
【参考方案1】:
您不能这样回收会话 ID,但您当然可以恢复会话状态的某些可预测部分。如果您使用表单身份验证,则只需读取 global.asax
session start
中的 forms-auth cookie 并重新填充会话对象。
您可以通过使用以下方法创建持久性 cookie 来手动控制表单身份验证 cookie 的过期时间:
FormsAuthentication.SetAuthCookie(userName, true)
或者,您可以通过手动更改 cookie 来微调过期时间:
Dim authCookie As HttpCookie = FormsAuthentication.GetAuthCookie(userName)
Dim authTicket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(authCookie.Value)
Dim newAuthTicket As New FormsAuthenticationTicket(authTicket.Version, authTicket.Name, authTicket.IssueDate, expireDate, authTicket.IsPersistent, userData)
authCookie.Value = FormsAuthentication.Encrypt(newAuthTicket)
authCookie.Expires = newAuthTicket.Expiration
HttpContext.Current.Response.Cookies.Set(authCookie)
expireDate
指定 cookie 的过期时间。
现在在global.asax
session start
中,您可以检查返回的用户是否仍然经过身份验证(通过先前设置的持久性cookie):
If HttpContext.Current.User.Identity.IsAuthenticated Then
' Here re-populate the predictable part of session state
' Like user profile etc.
End If
在运营洞察后添加:
没有使用表单身份验证,目的是能够恢复之前的会话。
在这种情况下,唯一的选择是通过持久 cookie 保持现有会话,以便您以后可以检索它。有一些解决方法可以实现这一点。此博客作者在此处解释了一种解决方法:
http://weblogs.asp.net/imranbaloch/archive/2010/06/09/persisting-session-between-different-browser-instances.aspx
这里发生的事情是我们拦截了global.asax
中的两个事件:
PostRequestHandlerExecute
:(在 ASP.NET 事件处理程序完成执行时发生)在这个处理程序中,我们创建一个新的 cookie(比如 temp),它的值被赋值当前的 SessionId。我们通过将 expires 属性设置为会话超时来使其成为持久 cookie。
PostMapRequestHandler
:(当 ASP.NET 将当前请求映射到适当的事件处理程序时发生)在此处理程序中,我们通过检查“temp”的存在来检查返回用户>”饼干。如果找到,我们用我们的“temp”cookie 的值更新实际的会话 cookie (ASP.NET_SessionId
);从而有效地恢复之前的会话。
请注意,这只是一种解决方法。该系统旨在创建一个新会话。我们所做的就是使用一些钩子来解决这个问题,方法是持久化现有会话以便稍后检索它。所有安全隐患都成立。
【讨论】:
我的应用没有使用任何身份验证。 在这种情况下,您只需保存一个简单的 httpcookie(而不是修改 forms-auth cookie),其用户 ID/名称将在很长一段时间内到期。在global.asax
中阅读并重新加载会话对象。
这不是关于重新填充会话,而是关于在浏览器重新打开时保留旧会话。
如您所知,会话 cookie 不是持久的。最简单的方法是通过持久 cookie 来持久化现有会话,以便您以后可以检索它。但是,可能有一些我自己从未使用过的技巧。例如weblogs.asp.net/imranbaloch/archive/2010/06/09/…
非常感谢。您发送的链接有效。如果您将答案更改为博客中建议的内容,我可以接受您的答案。【参考方案2】:
至少您可以检索会话信息。当您将“模式”设置为“SqlServer”时,这可以轻松完成。
您可以查询数据库 (ASPState) 以及存储会话的表 (ASPStateTempSessions)。[我使用了持久存储:-sstype p]
SELECT TOP 5 [SessionId]
,[Created]
,[Expires]
,[LockDate]
,[LockDateLocal]
,[LockCookie]
,[Timeout]
,[Locked]
,[SessionItemShort]
,[SessionItemLong]
,[Flags]
FROM [ASPState].[dbo].[ASPStateTempSessions]
即使您知道您的 sessionID,您也可以使用它来恢复您之前的会话。当您执行新请求时,Asp.Net 会生成一个新的 SessionID。
【讨论】:
以上是关于Asp.Net:关闭并重新打开浏览器实例后保留旧的浏览器会话的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net 将用户数据存储在 Auth Cookie 中
PDF 生成后无法打开 (vb.net) (asp.net)
ASP.NET MVC 重新编译限制达到 15 HostingEnvironment 启动关闭 HostingEnvironment 导致关闭