3

有没有办法在用户关闭浏览器然后重新打开后保留浏览器会话。

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

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

4

2 回答 2

4

您不能这样回收会话 ID,但您当然可以恢复会话状态的某些可预测部分。如果您使用表单身份验证,则只需读取表单身份验证 cookieglobal.asax session start并重新填充会话对象。

您可以通过使用以下方法创建持久性 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)

WhereexpireDate指定 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

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

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

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

于 2013-07-23T11:40:52.897 回答
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。

于 2013-07-23T12:55:11.673 回答