IE8在popup窗口中丢失会话cookie

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

一旦用户login,使用window.open('location here');popup一个新窗口window.open('location here'); 。 打开的页面实际上是用户在其他会话中工作的工作空间。 在这个页面上,还使用了其他popup窗口。

最近,我们有很多客户(都使用最新版本的IE8)抱怨他们login的时候,最初的popup窗口将他们带回到login屏幕,而不是他们的主页。 或者,用户有时可以login,进入主页(这又是一个新的popup窗口),看起来一切正常,直到创build了任何其他popup窗口,开始将其redirect到login屏幕再次。

在试图解决这个问题时,我使用了很好的老提琴手。 当问题开始显现时,我发现浏览器没有发送ASP.NET会话ID会话cookie或Forms Auth票证会话cookie,尽pipe对POST日志的响应清楚地推送了这些cookie。

更奇怪的是,如果我CTRL + N从缺less会话cookie的popup窗口打开一个新窗口,然后手动input到主页的URL,这些cookie奇妙地再次出现。 但是,后来的window.open(); 电话将继续被打破,不会发送会话cookie并使用户login屏幕。

需要注意的是,有时候看起来没有什么好的理由,那些同样的用户可以突然login并正常工作一段时间,然后又回到破解状态。

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

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

我一直在寻找几天,并没有发现任何可操作的。 哎呀,有时我甚至不能可靠地重现它。 我发现有几个人提到这个问题,但是他们似乎引用了一个据称在beta或RC版本中修复的问题(例如: redirect后打开一个新窗口时,IE8会丢失cookie )。 这些是IE的发布版本,包含最新的补丁。

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

更新

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

有时间去淘汰ProcMon,看看是否有资源访问问题。

更新#2

似乎有多个angular度来看似乎是一个单一的问题。 我很久以前就报告说,让用户成为本地pipe理员似乎有所帮助。 对于一些用户来说,它确实如此。 当然,这不是一个真正的解决scheme,但它确实让我们蹒跚而行。

然后,更多的用户开始报告问题,而pipe理修复无助。 用户似乎主要是Win7,但Vista也受到影响。 他们似乎也主要是64位安装。

如下面的一些成员所build议的将TabProcGrowth设置为0或1(或者工作)似乎已经在很大程度上解决了这个问题。 所以,我将把我接受的答案提交给第一个提出这个问题的人,因为它已经有了更多的影响力。

这是一个非常令人沮丧的问题,因为难以复制,而且经常发生在用户身上,我没有直接的交stream,或者到达他们的时候,这似乎并不奏效。 我只能说会话合并function是不正确的,但是我没有太多的数据来提供给微软来寻找永久性的修复。

这是IE8中的“新”function!

检查下面的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似乎被保留在这个进程的边界上)。

我个人认为这是坏的或错误。 正如我们所知道的,当浏览到“相同域名目标”的Cookie时,应该保留并重新发送。 IE8有不同的安全处理行为..太棒了! 它performance得很差,即使在另一个窗口中转到同一目标域,也会丢弃cookie,这只是我认为的一个错误。

您可以通过Internet Explorer选项修改IE8使用的进程数ehh ..修改registry设置!!!!!! (这是什么使它成为一个错误在我看来,IE提供了一个UI来修改这些设置将使其“企业级可以接受”。

看待,

马文·斯密特

这背后有多种可能 –

  • UAC和Vista (不得不出现!!)。 具体来说,寻找保护模式的行为。
  • 这可能是IE8中的会话合并function的实际问题。 更重要的是,因为通过Ctrl + N快捷方式打开一个新窗口会导致cookie在您的情况下被神奇地发送。
  • 一个老版本IE的问题(我知道你已经说过你的客户正在使用最新版本)。 您可能想要查看Microsoft Connect上提供的详细信息,以获取错误ID 408806和392032 。

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

虽然,我们没有启用保护模式,而区域是“内联网”。 很明显,这是Windows 7 64Bit的一个问题/错误,正如其他人所说的那样。

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

据我所知,另一个跨越标签的cookie变化从2013年11月12日开始在这个安全更新中实现, 这个更新在我们的应用程序中打破了所有版本IE的function。 我们在popup的窗口中进行OpenIDauthentication,以便在用户首次点击login链接时不必将用户从他们正在浏览的页面redirect。 login的会话cookie在popup窗口的请求中被正确地发送,但是它从来没有被主浏览器窗口看到,所以下一个对服务器的请求没有像它应该那样的会话cookie,因此login从不实际工作。

有没有人有任何可能的解决办法呢?

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

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

由于IE8我们(和我们的客户)也遇到同样的问题。 我们有一个asp服务来创build表单。 此应用程序使用新窗口添加元素或pipe理用户帐户,例如随机(当打开一个新窗口时),应用程序没有得到所需的会话ID与其他“永久性”Cookie的authenticationallong。 因此,会话ID是一个临时cookie。 大多数情况下进展顺利,但是每次打开新窗口时会话都会中断。 我们必须build议我们的客户closures所有IE窗口并重新开始。

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

微软表示,这些问题/错误在最终版本中被压缩,并不能让我相信他们的努力将会解决这个问题。

我也为这个问题find了一个可行的解决办法。 IE8如何处理打开另一个窗口中的相对path(如/ test)的servlet似乎存在问题。 这似乎是开了一个新的会议,以及一个新的窗口。 我们可以解决的问题是,我们只是使用了一个jsp页面,而不是用相对path打开一个新窗口。 所以当我们导航到一个URL时,我们不再导航到/testing了。我们导航到一个特定的文件。 在jsp文件中,我们将请求转发给相对path。 这似乎工作,这是有点尴尬,因为唯一的区别是我们正在放置一个特定的文件之间。

我希望这有帮助。

我知道这个问题,因为IE 5,所以我只使用模式popup窗口中的会话的variables…当我打开一个非模态的popup窗口,我用ASP.NETcaching和新的对象集合replace所有会话的variables。 ..但是很烦人!

其他浏览器(即Firefox)没有这个问题…

我相信这实际上是IE中的一个bug; 我已经在这里报告,看看我得到什么反馈: http : //social.msdn.microsoft.com/Forums/en-US/83bb3b91-1c1f-4d51-9281-9bc5f51d3640/log-in-fails-cookie-is-未发送到始发标签?论坛= iewebdevelopment

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

从控件启动时,我可以看到一个新的iexplore.exe进程被激活; 因此会话丢失行为是有道理的,因为已经提到关于内存中的cookie没有被传递到新的过程。

我仍然试图找出自己的解决方法…

更新

找出一个可行的修复! 可以对SessionIDManager进行子类化,并指定应该使用此类而不是默认( Web.config中的 <sessionState sessionIDManagerType="..."> )。 子类可以在CreateSessionID()的覆盖中查找包含现有会话ID的查询参数,如果find,则返回它。 这基本上允许页面请求被“合并”到它所知道的现有会话中。

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

山楂斌

曾与PHP5和IE8类似的问题。 当使用window.open打开Javascript中的某个popup窗口时,IE8丢失了会话cookie并强制用户loginagan。

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

罪魁祸首原来是一个图像标签。 模板系统dynamic地生成图像src =值,并且缺less图像导致带有空的src子句的图像标签(

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

我遇到了使用会话variables将值传递给popup窗口的类似问题。 我刚刚结束了将值写入一个持久性cookie,然后在popup窗口中读取cookie。 这可能不适用于您使用表单身份validation的问题,但是如果只是使用会话variables将一些值传递给IE8中的某个窗口,持久性cookie似乎对我有用。

编辑:另见这个线程

您也可以使用LocalStoprage方法重置父窗口中的值。 localStorage的( “钥匙”)= “值”; //使用Javascript