【问题标题】:IE8 losing session cookies in popup windowsIE8 在弹出窗口中丢失会话 cookie
【发布时间】:2009-08-24 19:15:18
【问题描述】:

我们有一个使用 Forms Auth 的 ASP.NET 应用程序。当用户登录时,会生成一个会话 ID cookie 和一个 Forms Auth 票证(存储为 cookie)。这些是会话 cookie,而不是永久 cookie。当浏览器关闭时,用户被有效地注销是有意和可取的。

一旦用户登录,就会弹出一个使用window.open('location here'); 的新窗口。打开的页面实际上是用户在其余会话期间工作的工作区。在此页面中,还使用了其他弹出窗口。

最近,我们有一些客户(都使用最新版本的 IE8)抱怨当他们登录时,最初的弹出窗口会将他们带回登录屏幕而不是他们的主页。或者,用户有时可以登录,进入主页(这又是在一个新的弹出窗口中),一切似乎都很好,直到创建任何其他弹出窗口,它开始将它们重定向到登录屏幕再次。

在尝试解决问题时,我使用了老 Fiddler。当问题开始显现时,我注意到浏览器没有发送 ASP.NET 会话 ID 会话 cookie 或 Forms Auth 票证会话 cookie,即使对 POST 中的日志的响应清楚地推低了这些 cookie。

更奇怪的是,如果我 CTRL+N 从缺少会话 cookie 的弹出窗口中打开一个新窗口,然后手动输入主页的 URL,这些 cookie 又神奇地出现了。但是,后续的 window.open(); 调用将继续中断,不会发送会话 cookie 并将用户带到登录屏幕。

请务必注意,有时,这些用户可能会突然登录并正常工作一段时间,但似乎没有什么充分的理由,然后又回到故障状态。

现在,我已确保没有浏览器加载项、插件、工具栏等正在运行。我已将我们的站点添加为受信任站点并将安全设置降至低,我已将 Cookie 隐私策略修改为“全部接受”,甚至禁用了自动策略设置,手动强制它接受所有内容并包含会话 cookie。似乎没有任何影响。

另请注意,Web 应用程序驻留在单个服务器上。没有负载平衡、网络花园、服务器场、集群等。服务器确实驻留在 ISA 服务器后面,但除此之外它非常简单。

我已经搜索了几天,但没有找到任何可行的方法。哎呀,有时我什至无法可靠地复制它。我发现了一些关于有同样问题的人的引用,但他们似乎引用了一个据称在 beta 或 RC 版本中修复的问题(例如:IE8 loses cookies when opening a new window after a redirect)。这些是 IE 的发布版本,带有最新的补丁。

我知道我可以尝试设置永久 cookie 而不是会话 cookie。但是,这对我们的应用程序具有严重的安全隐患。

更新

当用户被添加为机器上的本地管理员时,问题似乎自动消失了。只有时间才能证明这种变化是否会永久(和积极地)影响这个问题。

是时候破坏 ProcMon 并查看是否存在资源访问问题。

更新 #2

对于看似单一的问题,似乎有多个角度。我很久以前报告说,让用户成为本地管理员似乎有帮助。对于许多用户来说,它确实如此。当然,这并不是真正的解决方案,但它确实让我们步履蹒跚。

然后更多的用户开始报告这个问题,而管理员修复没有帮助。用户似乎主要是Win7,但Vista也受到了影响。它们似乎也主要是 64 位安装。

按照下面一些成员的建议,将 TabProcGrowth 设置为 0 或 1(两者都有效)似乎在很大程度上解决了这个问题。因此,我将把我接受的答案转移给第一个提出该建议的人,因为它的影响要大得多。

这是一个非常令人沮丧的尝试解决的问题,因为它很难重现并且经常发生在我没有直接沟通的用户身上,或者当我找到他们时它似乎没有在职的。我只能说会话合并功能有问题,但我没有太多数据可以提供给 Microsoft 以找到永久修复。

【问题讨论】:

  • 有没有人找到真正的解决方案?我们的测试已确定这特定于 64 位机器上的 IE8。 32 位机器上的 IE8 可以在这种情况下正常工作。在 64 位机器上尝试了 32 位和 64 位版本的 IE8,它们都有同样的问题。测试是使用 Windows Server 2008 标准版完成的。谢谢,丹麦
  • 我仍然遇到这个问题。好痛
  • 如果您打开带有 target="_blank" 的链接,这似乎也会发生。微软是一堆[由于极端语言而自我审查的其余评论]
  • @MadHalfling 你知道有什么变通办法吗?除了 _blank 是否允许跨窗口传播 cookie 之外,还有其他方法可以打开新窗口吗?
  • @CydeWeys AFAIK 除了更改阈值的注册表设置外,没有其他解决方法。有关更多详细信息,请参阅已接受答案的链接 - 它超出了 innept

标签: cookies internet-explorer-8 popup


【解决方案1】:

这是 IE8 中的“新”功能!

查看下面的 IE8 博客以了解它。

http://blogs.msdn.com/askie/archive/2009/03/09/opening-a-new-tab-may-launch-a-new-process-with-internet-explorer-8-0.aspx

IE8 可以使用多个进程来处理 x 个 IE 窗口。当您跨越进程空间时,您会丢失 cookie(Asp.Net 会话 ID 似乎保留在此进程边界上)。

我个人认为它已损坏或存在错误。正如我们所知,在浏览“相同域目标”时,cookie 应该被维护并重新发送。 IE8 具有不同的安全处理行为。太好了!在我看来,它的行为很糟糕并且“即使在另一个窗口中转到相同的目标域也会丢弃 cookie”只是一个错误。

您可以通过 Internet Explorer 选项修改 IE8 使用的进程数 ehh.. 修改注册表设置!!!!!! (这就是我认为它成为错误的原因。提供 UI 来修改这些设置的 IE 将使其成为“可接受的企业级”。

注意,

马文·斯密特

【讨论】:

  • 企业可以通过 GP 修改设置,但这确实漏掉了重点:IE 将确保新进程具有旧进程 cookie。如果没有,那将是一个错误,并且此类错误在最终版本发布之前已被消除。
  • @EricLaw-MSFT 我认为该错误仍然存​​在,如果发布时更加不稳定的话。我同意并且个人也认为它 一个错误。我可以通过对机器施加压力/加载然后打开大量 IE 窗口来复制这种行为。所描述的从服务器接收 cookie 并且在下一个请求中 由浏览器发送的行为似乎不正确。
  • 白痴设计 - Asp.Net 网站是一个硬 cookie,这就是它跨进程工作的原因 - 如果您在 Yahoo 上尝试此操作并通过取消选中“让我登录”来使用会话 cookie选项发生同样的事情。我同意您的错误评估,因为它并不总是发生(如果算法决定不启动新进程),因此您可以在新选项卡中多次打开相同的链接,有时它会持续登录会话,有时它不会,并且会挑战您的凭据。
【解决方案2】:

这背后有多种可能性——

  • UAC & Vista(不得不突然出现!!)。具体来说,寻找保护模式行为。
  • 这可能是Session Merging feature in IE8 的实际问题。更重要的是,因为通过 Ctrl+N 快捷方式打开一个新窗口会导致 cookie 在您的情况下被神奇地发送。
  • 较旧版本的 IE 存在问题(我知道您已声明您的客户使用的是最新版本)。您可能需要在 Microsoft Connect 上查看错误 ID 408806392032 的详细信息。

【讨论】:

  • 不是保护模式。它与松耦合的 IE 特性有关,它与会话合并有关。在 IE8 Beta 和 RC 期间,我们在这里遇到了很多错误。我们修复了这些。我相信这个空间中的所有开放错误都已在 RTM + 完整补丁中修复,因此请确保用户安装了所有最新补丁。如果你能给我一个 .SAZ 文件(Fiddler 导出),我会看看。
  • 受影响的用户肯定都安装了最新的补丁,并且是 Vista 和 XP 的混合体。但是,我不禁动摇了这里可能存在倒退的感觉。但是,我无法可靠地重现这一事实使得证明或反驳这一点变得困难。当我可以对有问题的机器进行这种级别的访问时,我将尝试遵循在 Beta 和 RC 错误中看到的超线程资源。我一定会发送一个 Fiddler 导出。谢谢。
【解决方案3】:

我们通过将“设置选项卡进程增长”更改为 0 解决了这个问题。

虽然我们没有打开保护模式,并且区域是“Intranet”。正如其他人所说,这显然是 Windows 7 64Bit 的问题/错误。

此页面 (#4) 引导我找到解决方案:http://blog.httpwatch.com/2009/04/07/seven-things-you-should-known-about-ie-8/

【讨论】:

    【解决方案4】:

    据我所知,从 2013 年 11 月 12 日起,this security update 对跨标签的 cookie 进行了另一项更改,这破坏了我们应用程序在所有版本的 IE 中的功能。我们在弹出窗口中进行 OpenID 身份验证,以便不必在用户第一次单击登录链接时将用户重定向到他们正在浏览的页面。登录的会话 cookie 在弹出窗口的请求中正确发送,但主浏览器窗口永远不会看到它,因此对服务器的下一个请求没有它应该的会话 cookie,因此登录永远不会真正起作用。

    有人对此有任何可能的解决方案吗?

    【讨论】:

      【解决方案5】:

      我们在 IE6、7 和 8 上遇到了这个问题。场景是父窗口(1)打开一个模态窗口(2),模态窗口有一个到非模态窗口的链接(3)。我曾经在第三个窗口中获得不同的会话 ID。

      此处提到的解决方法修复了问题http://support.microsoft.com/kb/831678

      【讨论】:

        【解决方案6】:

        自 IE8 以来,我们(和我们的客户)也遇到了同样的问题。我们有一个用于创建表单的 asp 服务。此应用程序使用新窗口来添加元素或管理用户帐户,例如随机(当打开一个新窗口时),应用程序没有获得身份验证所需的会话 ID 以及其他“永久”cookie。因此,会话 id 是一个临时 cookie。大多数情况下它运行良好,但有时每次打开新窗口时会话都会中断。我们必须建议我们的客户关闭所有 IE 窗口并重新开始。

        作为一名网络开发人员,我广泛使用 IE。就个人而言,我没有遇到上述问题。但我认为一个相关的。一天几次 IE 在打开新窗口时完全挂起(不再响应)。当我使用任务管理器杀死某个 IE 进程时,IE 再次开始响应。但在大多数情况下,最好从一个全新的 IE 实例重新开始。出于这个原因,我只是杀死了内存使用量最少的进程,这会导致所有 IE 进程退出。

        Microsoft 表示这些问题/错误在最终版本中已被消除,这并不让我相信他们为解决问题所付出的努力。

        【讨论】:

          【解决方案7】:

          我还找到了解决此问题的可行方法。 IE8 如何处理在另一个窗口中使用 /test 等相对路径打开 servlet 似乎存在问题。它似乎正在打开一个新会话和一个新窗口。我们可行的解决方法是,我们只使用一个 jsp 页面,而不是打开一个具有相对路径的新窗口。因此,当我们导航到 URL 时,我们不再导航到 /test。我们导航到特定文件。在jsp文件中,我们将请求转发到相对路径。这似乎可行,但有点尴尬,因为唯一的区别是我们在两者之间放置了一个特定的文件。

          我希望这会有所帮助。

          【讨论】:

            【解决方案8】:

            我从 IE 5 开始就知道这个问题,所以我只在模态弹出窗口中使用会话的变量... 当我打开一个非模态弹出窗口时,我将所有会话变量替换为 ASP.NET 缓存和新对象集合...... 但是很累!

            其他浏览器(如火狐)没有这个问题...

            【讨论】:

              【解决方案9】:

              我相信这实际上是 IE 中的一个错误;我在这里报告了它,看看我得到了什么反馈:http://social.msdn.microsoft.com/Forums/en-US/83bb3b91-1c1f-4d51-9281-9bc5f51d3640/log-in-fails-cookie-is-not-sent-to-originating-tab?forum=iewebdevelopment

              【讨论】:

              • 事实证明这既是我们的错,也是 IE 的错。我们设置了两个 cookie,出于某种原因,IE 将它们都杀死了。我们将删除其中一个 cookie,并希望能够解决问题。 IE 杀死他们俩的问题已上报给工程团队。
              【解决方案10】:

              我有一个类似但不相同的问题。我们将打开带有window.open() 的弹出窗口的网页加载到 IE 浏览器控件中。在具有 IE6 和 IE8 的计算机上,当从控件启动时,弹出窗口总是由 ASP 分配一个新的 SessionID。但是,当从普通浏览器(IE 或 Firefox)启动时,弹出窗口会获取现有的 SessionID。

              从控件启动时,我可以看到生成了一个新的iexplore.exe 进程;因此,考虑到内存中的 cookie 没有被转移到新进程,会话丢失行为是有意义的。

              我仍在尝试自己找出解决方法...

              更新

              想出了一个可行的解决方法!可以将SessionIDManager 子类化并指定应使用该类而不是默认类(Web.config 中的<sessionState sessionIDManagerType="...">)。子类可以在CreateSessionID() 的覆盖中查找包含现有会话ID 的查询参数,如果找到则返回它。这实质上允许页面请求“合并”到它知道的现有会话中。

              window.open() 的调用只需在其 URL 中指定查询参数即可。

              虎斌

              【讨论】:

              • 您能否发布您的解决方案的代码示例。
              【解决方案11】:

              PHP5 和 IE8 也有类似的问题。当使用 window.open 在 Javascript 中打开某个弹出窗口时,IE8 会丢失会话 cookie 并强制用户重新登录。

              同时,其他弹出窗口工作正常。

              原来罪魁祸首是图像标签。模板系统会动态生成图像 src = 值,并且缺少图像会导致图像标记带有空 src 子句 (

              我怀疑这与 IE 将空 src-tag 解释为不安全的 URL 并在未通知用户的情况下在弹出窗口中隔离会话有关。

              【讨论】:

                【解决方案12】:

                我在使用会话变量将值传递到弹出窗口时遇到了类似的问题。我刚刚将值写入持久性 cookie,然后在弹出窗口中读取 cookie。这可能不适用于您在表单身份验证中遇到的问题,但如果只是使用会话变量将一些值传递给 IE8 中的窗口,那么持久 cookie 似乎对我有用。

                编辑:另见this thread

                【讨论】:

                  【解决方案13】:

                  您还可以使用 LocalStoprage 方法重置父窗口中的值。 localStorage("Key")="Value";//Javascript

                  【讨论】:

                  • 你能解释一下吗?
                  猜你喜欢
                  • 2011-02-25
                  • 1970-01-01
                  • 2010-10-20
                  • 1970-01-01
                  • 2010-09-17
                  • 2016-05-30
                  • 2021-03-03
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多