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

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

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

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

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

    在尝试解决问题时,我使用了好的老提琴手。当问题开始显现时,我注意到浏览器没有发送ASP.NET会话ID会话cookie或Forms Auth ticket会话cookie,即使对登录帖子的响应显然会推下这些cookie。

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

    需要注意的是,有时,由于似乎没有什么好的理由,这些用户可以突然登录并正常工作一段时间,然后又恢复到故障状态。

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

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

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

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

    使现代化

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

    更新#2

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

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

    这是一个令人难以置信的令人沮丧的问题,因为它很难重现,并且经常发生在我没有直接联系的用户身上,或者在我找到他们时,它似乎不起作用。我所能说的是,会话合并功能有些不对劲,但我没有太多数据可以提供给Microsoft以找到永久性修复。

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

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

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

    看待

    马文·斯密特

        2
  •  6
  •   Vineet Reynolds    15 年前

    • UAC & Vista (不得不突然出现!!)。具体来说,寻找受保护的模式行为。
    • 这可能是一个实际的问题 Session Merging feature in IE8 . 更重要的是,通过 快捷方式使cookies在您的案例中神奇地发送。
    • IE的旧版本存在问题(我知道您已经声明您的客户正在使用最新版本)。您可能需要查看Microsoft Connect上的详细信息以获取bug ID 408806 392032 .
        3
  •  3
  •   Shayne    15 年前

    我们通过将“Set tab process growth”更改为0解决了这个问题。

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

        4
  •  2
  •   Cyde Weys    11 年前

    就我所知,另一个对cookies的跨标签更改刚刚开始 this security update

        5
  •  1
  •   Vishwa Kumar    15 年前

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

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

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

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

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

    微软说这些问题/漏洞在最终版本中已经消除了,这并不能让我相信他们在解决这个问题上所做的努力仍然是有经验的。

        7
  •  1
  •   Crystal Chan    14 年前

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

    我希望这有帮助。

        8
  •  1
  •   Bill the Lizard    14 年前

    我从IE 5就知道这个问题,所以我只在模式弹出窗口中使用会话变量。。。 但这很烦人!

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

        9
  •  1
  •   sonstabo    11 年前
        10
  •  0
  •   Haw-Bin    15 年前

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

    我可以看到,当从控件启动时 iexplore.exe 这个过程产生了;因此,会话丢失行为是有意义的,因为已经提到内存中的cookie没有被带入新进程。

    我自己还在想办法解决这个问题。。。

    使现代化

    想出一个可行的解决办法!可以将子类化 SessionIDManager 并指定应使用该类而不是默认类( <sessionState sessionIDManagerType="..."> 在里面 CreateSessionID() ,并在找到时返回。这本质上允许页面请求被“合并”到它知道的现有会话中。

    window.open() 然后只需要在其URL中指定查询参数。

        11
  •  0
  •   xilaworp    12 年前

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

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

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

        12
  •  0
  •   Community CDub    8 年前

    编辑:另请参见 this thread

        13
  •  0
  •   Pavithran    9 年前

    还可以使用LocalStoprage方法重置父窗口中的值。