【发布时间】:2014-09-07 01:37:17
【问题描述】:
我了解 Session 对象用于存储每个会话的数据。我做了以下实验:
- 打开浏览器,访问一个aspx页面A,其中保存了一些数据到Session对象中。
- 保持浏览器打开并打开另一个选项卡以访问显示会话数据的 aspx 页面 B。它的显示方式与我在第 1 步中存储的一样。
- 我关闭浏览器重新访问页面B,存储的数据不见了。
从 3 开始,似乎服务器端以某种方式检测到我(客户端)已终止会话。但是当我检查 Fiddler 时,当我在步骤 3 中关闭浏览器时,没有任何位发送到服务器。
那么 ASP.NET 应用程序怎么可能知道我的第 3 步请求是针对新会话的呢?
会话是如何定义的?不同的标签是否总是属于同一个会话?
添加 1
虽然可以在页面A和页面B中显示会话数据,但是它们显示的会话ID是不同的。为什么?
正确
页面 A 和页面 B 中的会话 id 相同。我没有使用 InPrivate 浏览。
添加 2
确实有一个用于会话 ID 的 Cookie:
ASP.NET_SessionId=lmswljirqdjxdfq3mvmbwroy; path=/; domain=localhost; HttpOnly
在响应 POST 请求时设置。
所以我做了另一个实验,我关闭了浏览器(Fire Fox),正如预期的那样,Cookie 不再存在。我手动创建了 cookie,希望“伪造的 Cookie 可以恢复旧会话。”但 Fiddler 表示根本没有发送手动 cookie。
提琴手说:
This request did not send any cookie data.
那么是否可以伪造 cookie 并恢复之前的会话?
会话在服务器上存在多长时间?
【问题讨论】:
-
您是否使用基于 cookie 的会话?您是否在使用某种隐私浏览?因为你描述的不是标准行为。假设您使用的是一个浏览器,会话在选项卡之间是持久的,并且浏览器正在打开和关闭,但前提是您使用的是 cookie 会话。除非您从正确的 URL 开始,否则使用任何其他类型(例如 URL 附加)都会导致您在每次访问时生成新会话。
-
@siva.k 不是标准行为吗?通常 asp.net 会话依赖于会话 cookie。当浏览器关闭时它们会被丢弃,但如果您关闭标签,它们会被保留(这就是为什么强烈建议您在关闭标签之前从网站注销,另请参阅this post about Chrome and its session management on crashes)。在服务器上,它们将超时过期
-
@AdrianoRepetti cookie 在您关闭窗口时不会丢弃(假设不是私密的)。当您打开浏览器备份时,它会将最后一组 cookie 发送回站点。否则,您加载的每个页面都需要您在每次关闭和打开浏览器时重新登录。使用基于 cookie 的会话可确保客户端始终尝试将其标识符发送回服务器。如果没有此 cookie,服务器将始终将请求视为新会话。是的,会话 cookie 是标准行为,但 smwikipedia 所描述的不是。
-
"通常asp.net会话依赖于会话cookie"。当然,我说的是会话 cookie! AFAIK OP 所描述的是我看到的每个浏览器中的标准行为。会话 cookie 跨选项卡共享,并在窗口关闭时丢弃。
标签: asp.net session state-management