Asp.Net:关闭并重新打开浏览器实例后保留旧的浏览器会话

时间:2013-07-23 11:28:29

标签: asp.net asp.net-mvc session-cookies

在用户关闭浏览器然后重新打开后,我是否可以保留浏览器会话。

asp.Net中的默认行为是,当我们关闭浏览器时,它会将Asp.Net SessionId保存在浏览器cookie中过期。在重新打开时,浏览器asp.net会生成一个新的SessionId,即使旧的会话未在服务器端过期,我们也无法保留它。

我们可以控制Asp.Net中会话cookie 到期行为吗?

2 个答案:

答案 0 :(得分:4)

您不能回收会话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

在Op见解后添加

未使用表单身份验证,目的是只能恢复上一个会话。

在这种情况下,唯一的选择是通过持久性cookie 来保持现有会话,以便您以后可以检索它。有一些解决方法可以实现这一目标。这篇博客作者在此解释了其中一个解决方法:

http://weblogs.asp.net/imranbaloch/archive/2010/06/09/persisting-session-between-different-browser-instances.aspx

这里发生的是我们拦截global.asax中的两个事件:

  1. PostRequestHandlerExecute :(在ASP.NET事件处理程序完成执行时发生)在此处理程序中,我们创建一个新的cookie(比如 temp ),其值已分配当前SessionId的值。我们通过将expires属性设置为会话超时来使其成为持久cookie。

  2. PostMapRequestHandler :(在ASP.NET将当前请求映射到适当的事件处理程序时发生)在此处理程序中,我们通过检查“ temp <是否存在来检查返回的用户/ em>“cookie。如果找到,我们会使用“ temp ”Cookie的值更新实际会话Cookie(ASP.NET_SessionId);从而有效地恢复了上一届会议。

  3. 请注意,这只是一种解决方法。该系统旨在创建一个新会话。我们所做的就是使用一些钩子来解决这个问题,方法是保持现有会话以后再检索它。所有安全隐患都有效。

答案 1 :(得分:2)

至少可以检索会话信息。将“Mode”设置为“SqlServer”时,可以轻松完成此操作。

您可以查询数据库(ASPState)&amp;因此你存储Sessions的表(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。