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

35
我们有一个使用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应用程序驻留在单个服务器上。没有负载均衡、Web园艺、服务器农场、集群等。服务器确实驻留在ISA服务器后面,但除此之外,它非常直接。

我已经搜索了几天,没有找到任何可行的东西。有时候甚至无法可靠地重现它。我发现有几个人遇到了同样的问题,但他们似乎在引用一个据称已在Beta或RC版本中修复的问题(例如:IE8在重定向后打开新窗口时丢失Cookie)。这些都是具有最新补丁的IE版本。

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

更新

当将用户添加为本地管理员时,问题似乎会自动消失。只有时间才能告诉我们这种变化是否会永久(且积极地)影响这个问题。

到时间使用ProcMon并查看是否存在资源访问问题。

更新#2

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

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

将TabProcGrowth设置为0或1(任何一个都可以)如以下一些成员建议的那样,似乎在很大程度上解决了问题。因此,我将我的采纳答案移交给第一个提出这个建议的人,因为它产生了显着的影响。

这是一个非常令人沮丧的问题,因为很难复现,并且通常发生在我无法直接沟通的用户身上,或者当我到达他们时,它似乎已经没有问题了。我只能说会话合并功能存在问题,但我没有足够的数据向微软提供以找到永久解决方案。


1
有人找到了这个问题的真正解决方案吗?我们的测试确定这是针对64位机器上的IE8特定的。32位机器上的IE8在这种情况下可以正常工作。尝试在64位机器上使用32位和64位版本的IE8,但它们都有同样的问题。测试是使用Windows Server 2008标准版进行的。谢谢, DK - user306068
我仍然遇到这个问题。非常痛苦。 - Schotime
3
如果使用target="_blank"打开链接,似乎也会出现这种情况。微软是一群[由于使用极度粗俗的措辞,评论其余部分被自动屏蔽]。 - Mad Halfling
@MadHalfling 你知道有什么解决方法吗?除了_blank之外,是否还有其他方法可以打开一个允许在窗口之间传播cookie的新窗口呢? - Cyde Weys
据我所知,除了更改注册表设置以更改阈值之外,没有可行的解决方法。有关更多详细信息,请参见已接受答案的链接 - 它超出了无能的范畴。 - Mad Halfling
一个非常类似的问题正在发生在一个使用OAuth和多租户登录来重定向用户到其组织的登录页面的Office 365插件应用中。在这种情况下,当插件打开一个新窗口时,我们会“失去”与我们的插件相关的授权,即使用户成功登录到他们的租户。 - Danny Bullis
13个回答

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窗口。当您跨越进程空间时,会丢失您的cookies(Asp.Net会话ID似乎在此进程边界上保留)。

我个人认为这是有问题或者是一个bug。我们知道,当浏览到“相同域目标”时,应该维护和重置cookie。IE8具有不同的安全处理行为..太好了!它表现得很糟糕,“即使在另一个窗口中访问相同的目标域名也会删除cookie”,在我看来只是一个bug。

您可以通过Internet Explorer选项来修改IE8使用的进程数,嗯..修改注册表设置!!!(在我看来,这就是一个bug。如果IE提供UI来修改这些设置,那么它将成为“企业级可接受的”)。

敬礼,

Marvin Smit


3
企业可以通过GP修改设置,但这并不是重点:IE会确保新进程拥有旧进程的Cookie。如果没有这样做,那就是一个错误,而且在正式版本发布之前这种错误已经被修复了。 - EricLaw
3
@EricLaw-MSFT,我认为这个 bug 仍然存在,只是在发布版中表现得更加不稳定。我同意并个人认为这确实是一个 bug。我可以通过使计算机负载增加并打开大量 IE 窗口来复制此行为。所描述的行为,即从服务器接收 cookie,然后在下一个请求中浏览器 发送它们,似乎是不正确的。 - Neil Fenwick
设计上的愚蠢 - Asp.Net网站是一个硬饼干,这就是为什么它可以跨进程工作 - 如果你在Yahoo上尝试这个并且只使用会话cookie,通过取消“保持登录状态”选项,同样的事情会发生。我同意你的错误评估,因为它并不总是发生(如果算法决定不启动新进程),所以你可以在新标签页中打开相同的链接多次,有时它会保持已登录的会话,有时它不会,并要求你输入凭据。 - Mad Halfling

6
这背后有多种可能性 -
  • UAC & Vista(必须出现!!)。具体来说,请查看受保护模式的行为。
  • 这可能是IE8中会话合并功能的实际问题。更重要的是,通过Ctrl+N快捷键打开一个新窗口会在您的情况下神奇地发送cookie。
  • 与旧版IE的问题(我知道你已经说明你的客户正在使用最新版本)。您可能需要检查Microsoft Connect上可用的错误ID的详细信息408806392032

1
这不是保护模式。这与松散耦合的IE功能有关,与会话合并有关。在IE8测试版和RC期间,我们遇到了一堆错误。我们已经修复了这些。我相信在RTM +全套补丁中已经修复了此空间中的所有未解决错误,因此请确保用户安装了所有最新的补丁程序。如果您可以发送给我一个.SAZ文件(Fiddler导出),我将查看它。 - EricLaw
受影响的用户都明确地安装了最新的补丁,他们既有Vista也有XP。但是,我无法摆脱可能存在回归的感觉。然而,我无法可靠地重现这个问题,这使得证明或否定它变得困难。当我可以获得对有问题的机器这种级别的访问权限时,我将尝试遵循Beta和RC中看到的Hyperthreading方案。我一定会发送Fiddler导出文件。谢谢。 - moribvndvs

3

2
据我所知,2013年11月12日的这个安全更新刚刚在所有版本的IE中实施了跨选项卡的cookie变更,这破坏了我们应用程序的功能。我们在弹出窗口中进行OpenID身份验证,以免将用户从他们最初单击登录链接时正在浏览的页面重定向。登录的会话cookie已经在弹出窗口的请求中正确地发送下来,但是它从未被主浏览器窗口看到,因此下一次向服务器发出的请求就没有像应该那样带有该会话cookie,因此登录实际上从未生效。

有没有可能的解决方案?


1
我们在IE6、7和8上遇到了这个问题。场景是父窗口(1)打开一个模态窗口(2),模态窗口中有一个链接到非模态窗口(3)。我曾经在第三个窗口中获得了不同的会话ID。
这里提到的解决方法修复了这个问题http://support.microsoft.com/kb/831678

1
我还找到了一个可行的解决方案。在IE8中打开相对路径(如/test)的servlet时,似乎存在问题。它似乎会打开一个新会话以及一个新窗口。我们的可行解决方案是,不再使用相对路径打开一个新窗口,而是使用jsp页面。因此,当我们导航到URL时,不再导航到/test。我们导航到一个特定的文件。在jsp文件中,我们将请求转发到相对路径。这似乎有效,但有点尴尬,因为唯一的区别是我们在中间放置了一个特定的文件。
希望这可以帮助您。

1

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

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

微软声称这些问题/错误在最终版本中已被解决,但这并没有让我相信他们仍然在努力解决仍然存在的问题。


1

这证明了问题既是我们的错,也是IE的错。我们设置了两个cookie,但出于某种原因,IE将它们都删除了。我们将删除其中一个cookie,并希望解决这个问题。IE删除两个cookie的问题已经升级至工程团队。 - sonstabo

1

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

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


0

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


你能否更好地解释一下这个问题? - Vincent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接