有没有办法在用户关闭浏览器然后重新打开后保留浏览器会话。
asp.Net 中的默认行为是将 Asp.Net SessionId 保留在浏览器 cookie 中,当我们关闭浏览器时该 cookie 会过期。在重新打开浏览器时,asp.net 会生成一个新的 SessionId,即使旧会话在服务器端没有过期,我们也无法保留它。
我们可以控制Asp.Net中会话 cookie的过期行为吗?
有没有办法在用户关闭浏览器然后重新打开后保留浏览器会话。
asp.Net 中的默认行为是将 Asp.Net SessionId 保留在浏览器 cookie 中,当我们关闭浏览器时该 cookie 会过期。在重新打开浏览器时,asp.net 会生成一个新的 SessionId,即使旧会话在服务器端没有过期,我们也无法保留它。
我们可以控制Asp.Net中会话 cookie的过期行为吗?
您不能这样回收会话 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 来持久化现有会话,以便您以后可以检索它。有一些解决方法可以实现这一点。此博客作者在此处解释了一种解决方法:
这里发生的是我们拦截了两个事件global.asax
:
PostRequestHandlerExecute
:(在 ASP.NET 事件处理程序完成执行时发生)在此处理程序中,我们创建一个新的 cookie(例如temp),其值被分配给当前 SessionId 的值。我们通过将 expires 属性设置为会话超时来使其成为持久 cookie。
PostMapRequestHandler
:(当 ASP.NET 将当前请求映射到适当的事件处理程序时发生)在此处理程序中,我们通过检查“ temp ”cookie 的存在来检查返回用户。如果找到,我们用我们的“ temp ”cookieASP.NET_SessionId
的值更新实际的会话cookie( );从而有效地恢复之前的会话。
请注意,这只是一种解决方法。该系统旨在创建一个新会话。我们所做的就是使用一些钩子来解决这个问题,方法是持久化现有会话以便稍后检索它。所有安全隐患都成立。
至少您可以检索会话信息。当您将“模式”设置为“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。