【问题标题】:Where is session stored if cookie is disabled on client's machine? What is actually stored in session?如果在客户端机器上禁用 cookie,会话存储在哪里?会话中实际存储了什么?
【发布时间】:2010-11-26 22:39:25
【问题描述】:

在配置文件中我有以下设置

sessionState mode="InProc" cookieless="false"

这是否表明 sessionid 是在 cookie 中存储的?如果是,那么它是如何被挑选并发送到服务器的,以及它是如何在回发中验证的。

如果在我的浏览器中禁用 cookie 会发生什么,会话(会话 ID 和会话变量)是否仍会创建?

哪里(默认路径)是默认为会话创建和存储的 cookie,我可以更改路径吗?

会话的 cookie 中存储了哪些格式和类型的数据?

如果我在会话中存储一个类对象,那么实际存储在 cookie 中的是什么?

另外,如果我使用身份验证模式作为带有 cookie 的表单,那么如果在浏览器中禁用 cookie 会发生什么?

【问题讨论】:

  • 我知道如果我将 cookieless 设置为 true 则 sessionid 会附加到 url,但我只想知道 cookiesless 值是否设置为 false 并且客户端已禁用他机器上的 cookie应用程序会正常运行还是会脱离。我个人认为该应用程序不会像 Josh Stodola 所回答的那样工作。
  • 看看我帖子底部的注释。一句话,如果您完全禁用 cookie 并且仍然期望会话存在,并且不启用无 cookie 会话,则应用程序将中断。例如,我实际上运行了一个测试,并且在我的一个应用程序上我只是不断地获得登录屏幕。
  • 我创建了一个示例应用程序,其中会话属性 cookieless 设置为 false 并在浏览器中禁用了 cookie 并测试了它工作正常的应用程序。会话值存储在哪里?
  • 检查this
  • stackoverflow.com/questions/12572134/… 这个帖子会回答你的问题。

标签: asp.net session cookies


【解决方案1】:

会话 cookie 是一种特殊的非持久性 cookie。它只存储在内存中,因此在大多数情况下,即使 cookie 被禁用,它仍然可以正常工作。

还可以启用一种称为无 cookie 会话的功能,其中 sessionID 嵌入在 URL 中,如下所示:

http://yourserver/folder/(此处为加密会话 ID)/default.aspx

这里是 MSDN 文章的链接,其中包含更多详细信息:http://msdn.microsoft.com/en-us/library/aa479314.aspx

注意:可以完全阻止会话 cookie。例如,在 IE8 中,我只是进入工具 > Internet 选项 > 隐私。当我将滑块调到“高”或更高时,我的网站从未通过登录屏幕,因为会话 cookie 被阻止 - 事实上,乔什·斯托多拉在下面说,在这种情况下,甚至永远不会在服务器上创建会话。

但是,请了解此类行为有效地破坏了互联网。因此,除非您要建立一个针对阴谋论者的网站,否则在我看来(以及世界上大多数最大网站的意见),没有必要迎合极少数不按正常规则玩游戏的用户.

对他们来说,互联网并没有按照应有的方式运作。

【讨论】:

  • 在 IE6 到 IE8 中,您还可以禁用会话 cookie,如果您转到隐私 > 高级并选中“覆盖自动 cookie 处理”,在第一方 cookie 下选择“阻止”,并留下“始终允许”会话cookies”未选中。但是,如果您这样做,将会有很多网站无法正常运行。
  • +1 为 Dino 的文章 - 我打算添加它作为答案,但你已经有了
  • 您是说会话cookie,存储在客户端浏览器而不是内存(服务器)中吗?您的第一句话令人困惑?
  • @stom 会话cookie存储在客户端的内存中。我不确定服务器会如何处理它。
【解决方案2】:

我的猜测是客户端的每个请求都会被服务器视为一个新会话。

【讨论】:

    【解决方案3】:

    如果您碰巧从浏览器中获取了请求标头,您会看到 SessionID 是标头的一部分。服务器使用它来确定哪个会话属于哪个用户。

    【讨论】:

      【解决方案4】:

      会话 ID 不是通过 cookie 传递的,而是通常作为 URL 中的查询字符串或自定义 HTTP 标头传递。但是,在您描述的场景中,您的用户将永远无法获得会话,因为您将 cookieless 设置为 false。

      【讨论】:

      • 我创建了一个测试应用程序,其中我已将 cookieless 设置为 false,并且我已禁用浏览器中的 cookie。身份验证模式设置为表单。猜猜这个应用程序仍然有效吗?
      【解决方案5】:

      我没有亲自实施。但应该是这样的:

      由于 web.config 文件中的 Cookiles=false 和浏览器禁用了 cookie,当第一次请求页面时,HTTP 模块将检查表单身份验证 cookie。现在它将为空,将用户发送到登录页面。现在,当对网站上任何页面的第二次请求将再次出现时,它会再次发现表单身份验证 cookie 为空并将用户发送到登录页面。因此,对于每个请求,用户都需要创建新会话。

      【讨论】:

        【解决方案6】:

        不,如果禁用 cookie,会话将无法工作。

        如果您想在 cookie 禁用时使用会话,那么您可以通过 URL 传递会话。

        【讨论】:

        • 这并不完全准确,但在这种情况下可能就足够了
        【解决方案7】:

        直接存储在浏览器中

        【讨论】:

          【解决方案8】:

          会话状态可以通过两种方式存储将客户端与服务器会话相关联的唯一 ID;通过在客户端上存储 HTTP cookie 或在 URL 中编码会话 ID。

          Session Mode="InProc" 是一种默认模式,它将会话状态信息存储在 Web 服务器中。但是,当您说 cookieless="false" 时,您是在说将唯一 ID 存储在 cookie 中。此 ID 在创建会话时创建,因此在回发期间从 cookie 中获取 ID。如果 cookie 在浏览器中被禁用,是的,会话仍然会被创建,并且这个 id 会通过 URL 传递。

          您可以通过转到浏览器设置->隐私->内容设置->所有 cookie 和站点数据->与站点名称一起存储来浏览到 cookie 您可能会在 %userprofile%\AppData\Roaming\Microsoft\Windows\Cookies 中找到 cookie,但可能因操作系统而异。

          在 cookie 中,您通常会存储一小段不敏感的个人信息。如果您需要存储敏感数据,例如用户名和密码,最好对这些数据进行加密。

          您通常在 cookie 中存储有关用户的信息。更多详情请访问网址 http://msdn.microsoft.com/en-us/library/system.web.configuration.sessionstatesection.cookieless(v=vs.110).aspx http://msdn.microsoft.com/en-us/library/ff647070.aspx#pagexplained0002_cookielessforms

          【讨论】:

            【解决方案9】:

            每个请求都会创建新会话

            【讨论】:

            • -1:这绝对不是我对这里发生的事情的理解。
            • 创建了会话,但是因为在下一个请求中没有发送带有 sessionId 的 cookie 并且应用程序无法找出您的 sessionId 是什么,它将创建一个新的会话对象。在您的网页中尝试 Response.Write(Session.SessionID) 并关闭 cookie。
            猜你喜欢
            • 2016-09-01
            • 1970-01-01
            • 2020-08-28
            • 1970-01-01
            • 2023-04-10
            • 1970-01-01
            • 2016-06-07
            • 2015-06-23
            • 2019-03-11
            相关资源
            最近更新 更多