【问题标题】:ASP.NET : Why can I read session cookies even if no cookie exists?ASP.NET:为什么即使没有 cookie 也能读取会话 cookie?
【发布时间】:2015-10-18 21:13:38
【问题描述】:

看来我可以随时读取SessionID,即使当前不存在cookie!

Dim SessionID As String = Request.Cookies("ASP.NET_SessionId").Value

此代码将始终返回一个值,大概是 IIS 服务器端持有的 ID。

cookie 似乎仅在发出存储会话信息的请求时生成。

这是为什么?

还有……

如果我使用会话状态服务器,SessionID 是否与 cookie SessionID 不同,如果其中一个 ID 丢失或重置,哪个优先?

编辑

如果 app_pool 被重置。必须创建一个新的会话 ID,这会导致会话 cookie 也被更新吗?因为这可能会给已经登录的用户造成潜在的冲突。

【问题讨论】:

  • 当 session cookie 丢失(删除、过期)时,asp.net 会生成另一个来保存 sessionId,这样在任何时候,你都有一致的方式来引用 Session("something" ) 并获得预期的行为。

标签: c# asp.net vb.net session cookies


【解决方案1】:

当用户访问由 ASP.NET 提供支持的网站时,IIS 会生成一个 SessionID 来唯一标识用户会话。

如果网站使用 cookie:

<sessionState mode="StateServer" cookieless="UseCookies"/>

仅当网页发出存储会话信息的请求时,才会生成名为 ASP.NET_SessionId 的 cookie。如果没有存储会话信息,则不会创建 cookie,但用户仍将拥有一个活动的SessionID

当没有 cookie 存在时,从 IIS 读取 SessionID

服务器上的SessionID 始终具有优先权,并会在发出新请求以在 cookie 中存储信息时更新会话 cookie。

【讨论】:

    【解决方案2】:

    每次用户访问网站并打开会话时,ASP.Net 默认创建一个 SessionID,除非您指定无 cookie 选项:

    如果您使用会话状态服务器,则所有 Web 服务器的 SessionID 应该相同,否则您将无法找到相同的用户。

    如果 ID 丢失或重置,状态服务器将简单地创建一个新的并使用新的 SessionID 写入一个新的 cookie,而旧的将在过期时间后被删除。

    【讨论】:

    • 这并不完全正确。你可以自己测试一下。当用户访问网站时会生成SessionID,但在请求存储会话信息之前会生成cookie is not。如果没有存储会话信息,则不会创建 cookie,但用户仍将拥有一个活动的 sessionid。
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 2020-09-05
    • 2016-10-10
    • 2020-04-18
    • 2011-10-27
    • 2016-05-26
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多