代码之家  ›  专栏  ›  技术社区  ›  moribvndvs

IE8在弹出窗口中丢失会话Cookie

  •  35
  • moribvndvs  · 技术社区  · 16 年前

    window.open('location here');

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

    在尝试解决这个问题时,我使用了老式的Fiddler。当问题开始显现时,我注意到浏览器没有发送ASP。NET会话ID会话cookie或Forms Auth票证会话cookie,即使对POST登录的响应明确地推下了这些cookie。

    更奇怪的是,如果我按CTRL+N从弹出的窗口中打开一个缺少会话Cookie的新窗口,然后手动键入主页的URL,这些Cookie就会神奇地再次出现。然而,随后 window.open();

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

    我已经找了好几天了,没有找到任何可操作的东西。哎呀,有时候我甚至不能可靠地复制它。我发现了一些关于人们有同样问题的参考文献,但他们似乎是在引用一个据称在测试版或RC版中修复的问题(例如: IE8 loses cookies when opening a new window after a redirect ).这些是IE的发布版本,带有最新补丁。

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

    更新

    是时候破解ProcMon了,看看是否存在资源访问问题。

    更新#2

    随后,越来越多的用户开始报告该问题,而管理员的修复并未起到任何帮助。用户似乎主要是Win7,但Vista也受到了影响。它们似乎也大多是64位安装。

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

    13 回复  |  直到 9 年前
        1
  •  16
  •   Marvin Smit Marvin Smit    16 年前

    这是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似乎保留在此进程边界上)。

    我个人认为它坏了或者是个bug。众所周知,当浏览到“同一域目标”时,应维护并重新发送Cookie。IE8具有不同的安全处理行为。太棒了在我看来,它的行为很糟糕,“即使在另一个窗口中访问同一个目标域,也会删除Cookie”只是一个错误。

    您可以通过internet explorer选项ehh修改IE8使用的进程数。.修改注册表设置!!!!!!(在我看来,这就是它成为一个bug的原因。IE提供了一个用户界面来修改这些设置,这将使其“企业级可接受”。

    问候,

    马文·斯密特

        2
  •  6
  •   Vineet Reynolds    16 年前

    这背后有多种可能性-

    • UAC & Vista (必须突然出现!!)。具体来说,寻找保护模式行为。
    • Session Merging feature in IE8 更重要的是,通过打开一个新窗口 Ctrl+N 快捷方式使Cookie在您的情况下神奇地发送。
    • 旧版本IE的问题(我知道你说过你的客户正在使用最新版本)。您可能希望查看Microsoft Connect上提供的详细信息以获取错误ID 408806 392032 .
        3
  •  3
  •   Shayne    16 年前

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

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

        4
  •  2
  •   Cyde Weys    12 年前

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

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

        5
  •  1
  •   Vishwa Kumar    16 年前

    这里提到的解决方法解决了这个问题 http://support.microsoft.com/kb/831678

        6
  •  1
  •   W. Hörchner    16 年前

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

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

    微软表示,这些问题/错误在最终版本中得到了解决,这并不能让我相信他们解决问题的努力仍然有经验。

        7
  •  1
  •   Crystal Chan    15 年前

    我希望这能有所帮助。

        8
  •  1
  •   Bill the Lizard    15 年前

    我从IE5开始就知道这个问题,所以我只在模态弹出窗口中使用会话的变量。.. 当我打开一个非模态弹出窗口时,我用ASP。NET缓存和新对象集合。.. 但这很烦人!

    其他浏览器(如Firefox)没有这个问题。..

        9
  •  1
  •   sonstabo    12 年前
        10
  •  0
  •   Haw-Bin    16 年前

    我有一个类似的问题,虽然不完全相同。我们加载一个网页,打开一个弹出窗口 window.open() 进入IE浏览器控件。在具有IE6和IE8的计算机上,从控件启动时,ASP始终会为弹出窗口分配一个新的SessionID。然而,当从普通浏览器(IE或Firefox)启动时,弹出窗口会获取现有的SessionID。

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

    我仍在努力自己想出一个解决办法。..

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

    呼叫 window.open() 则只需要在其URL中指定该查询参数。

    郝斌

        11
  •  0
  •   xilaworp    12 年前

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

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

    原来罪魁祸首是一个图像标签。模板系统动态生成图像src=值,丢失的图像会导致一个带有空src子句的图像标签(

    我猜测这与IE将空的src标签解释为不安全的URL,并在弹出窗口中隔离会话而不通知用户有关。

        12
  •  0
  •   Community Mohan Dere    9 年前

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

    编辑:另请参见 this thread

        13
  •  0
  •   Pavithran    10 年前

    您还可以使用LocalStoprage方法重置父窗口中的值。 本地存储(“Key”)=“Value”;//Javascript

    推荐文章