我们有一个使用Forms Auth的ASP.NET应用程序。用户登录时,会生成会话ID cookie和Forms Auth票证(存储为cookie)。这些是会话cookie,而不是永久性cookie。当浏览器关闭时,用户有效地退出是有意和可取的。
用户登录后,会使用window.open('location here');
弹出一个新窗口。打开的页面实际上是用户在其余会话期间工作的工作空间。在此页面中,还会使用其他弹出窗口。
最近,我们有许多客户(都使用最新版本的IE8)抱怨他们登录时,初始弹出窗口会将他们带回登录屏幕而不是主页。或者,用户有时可以登录,进入主页(再次,在新的弹出窗口中),这一切看起来都很好,直到创建任何其他弹出窗口,它开始将它们重定向到登录屏幕试。
在尝试解决问题时,我使用了好老的提琴手。当问题开始显现时,我注意到浏览器没有发送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 loses cookies when opening a new window after a redirect)。这些是IE的发布版本,带有最新的补丁。
我知道我可以尝试设置永久性cookie而不是会话cookie。但是,这对我们的应用程序具有极大的安全隐患。
当用户在计算机上添加为本地管理员时,似乎问题会自动消失。只有时间会证明这种变化是否会永久(并且积极地)影响这个问题。
是时候破坏ProcMon并查看是否存在资源访问问题。
似乎存在多个角度似乎是一个单一的问题。我很久以前就报告说,让用户成为本地管理员似乎有所帮助。对于许多用户来说,它确实如此。当然,这不是一个真正的解决方案,但确实让我们陷入困境。
然后更多用户开始报告此问题,而管理员修复程序没有帮助。用户似乎主要是Win7,但Vista也受到了影响。它们似乎也主要是64位安装。
按照以下某些成员的建议将TabProcGrowth设置为0或1(可以使用)似乎已经在很大程度上解决了这个问题。所以,我将把我接受的答案移到第一个提出这个问题的人那里,因为它有更大的影响。
这是一个令人难以置信的尝试解决的问题,因为它难以复制,并且经常发生在我没有直接通信的用户身上,或者当我找到它们时,它似乎不是工作。我只能说会话合并功能有些不对劲,但我没有太多数据可以提供给微软来寻找永久修复。
答案 0 :(得分:16)
这是IE8中的“新”功能!
查看下面的IE8博客,了解它。
IE8可以使用多个进程来处理x个IE窗口。当您跨越进程空间时,您将丢失cookie(Asp.Net会话ID似乎保留在此进程边界上)。
我个人认为它已被破坏或是一个错误。我们知道,当浏览“同一域名目标”时,应该保留并重新发送cookie。 IE8具有不同的安全处理行为。太棒了!它表现得很糟糕,即使在另一个窗口中转到同一个目标域,“丢弃cookie”只是我认为的一个错误。
您可以通过Internet Explorer选项修改IE8使用的进程数量......修改注册表设置!!!!!! (这就是我的观点中的错误。提供UI来修改这些设置的IE将使其“企业级别可接受”。
方面,
Marvin Smit
答案 1 :(得分:6)
这背后有多种可能性 -
答案 2 :(得分:3)
我们通过将“设置标签流程增长”更改为0来解决此问题。
虽然我们没有打开保护模式,但区域是“Intranet”。显然这是Windows 7 64Bit的一个问题/错误,正如其他人所说的那样。
此页面(#4)引导我找到解决方案:http://blog.httpwatch.com/2009/04/07/seven-things-you-should-known-about-ie-8/
答案 3 :(得分:2)
据我所知,自2013年11月12日起,this security update的所有版本的IE中的功能都突破了。我们在弹出窗口中进行OpenID身份验证,以便在用户第一次单击“登录”链接时不必将用户重定向到他们浏览的页面。登录的会话cookie正确地在弹出窗口中的请求中发送,但主浏览器窗口永远不会看到它,因此下一个请求服务器的会话cookie就像它应该的那样,因此登录从未真正起作用。
有没有人对此有任何可能的解决方案?
答案 4 :(得分:1)
我知道自IE 5以来的这个问题,所以我只在模态弹出窗口中使用会话的变量... 当我打开一个非模态弹出窗口时,我用ASP.NET缓存和新对象集合替换所有会话的变量... 但它非常无聊!
其他浏览器(即Firefox)没有此问题......
答案 5 :(得分:1)
我们在IE6,7和8上遇到了这个问题。场景是父窗口(1)打开一个模态窗口(2),模态窗口有一个到非模态窗口的链接(3)。我曾经在第3个窗口中获得不同的会话ID。
此处提到的解决方法修复了问题http://support.microsoft.com/kb/831678
答案 6 :(得分:1)
自IE8以来,我们(和我们的客户)也遇到了同样的问题。我们有一个用于创建表单的asp服务。此应用程序使用新窗口添加元素或管理用户帐户,例如随机(当打开一个新窗口时),应用程序没有获得所需的会话ID,用于与其他“永久”cookie进行身份验证。因此,会话ID是临时cookie。大部分时间它都很顺利,但有时候每次打开新窗口时会话都会中断。我们必须建议客户关闭所有IE窗口并重新开始。
作为一名网络开发者,我广泛使用IE浏览器。就个人而言,我没有遇到上述问题。但我认为是相关的。一天几次IE完全挂起(不再响应)打开一个新窗口。当我使用任务管理器杀死某个IE进程时,IE再次开始响应。但在大多数情况下,最好从一个干净的新IE实例开始。出于这个原因,我只是使用最少的ram使用来杀死进程,这会导致所有IE进程退出。
微软称这些问题/错误在最终版本中被压扁并不能让我相信他们的努力能够解决仍然存在的问题。
答案 7 :(得分:1)
我还找到了解决此问题的可行方法。 IE8如何处理在具有相对路径(如/ test)的另一个窗口中打开servlet似乎存在问题。它似乎正在打开一个新会议以及一个新窗口。我们可行的解决方案是,我们只使用了一个jsp页面而不是打开一个带有相对路径的新窗口。因此,当我们导航到URL时,我们不再导航到/ test.We导航到特定文件。在jsp文件中,我们将请求转发到相对路径。这似乎有用,这有点尴尬,因为唯一的区别是我们在两者之间放置一个特定的文件。
我希望这会有所帮助。
答案 8 :(得分:1)
我相信这实际上是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
答案 9 :(得分:0)
我有一个类似但不完全相同的问题。我们加载一个网页,打开一个带有window.open()
的弹出窗口到IE浏览器控件中。在具有IE6和IE8的计算机上,从控件启动时,弹出窗口始终由ASP分配一个新的SessionID。但是,从普通浏览器(IE或Firefox)启动时,弹出窗口将获取现有的SessionID。
我可以看到从控件启动时会产生新的iexplore.exe
进程;因此,鉴于内存中的cookie没有被转移到新进程,会话丢失行为是有意义的。
我仍然在试图找出一个解决方法......
<强>更新强>
找出可行的修复方法!可以继承SessionIDManager
并指定应该使用此类而不是默认( Web.config 中的<sessionState sessionIDManagerType="...">
)。子类可以在覆盖CreateSessionID()
中查找包含现有会话ID的查询参数,并在找到时返回它。这实质上允许页面请求“合并”到它知道的现有会话中。
对window.open()
的调用只需要在其URL中指定查询参数。
唧唧滨
答案 10 :(得分:0)
与PHP5和IE8有类似的问题。当使用window.open在Javascript中打开某个弹出窗口时,IE8丢失了会话cookie并强制用户登录agan。
与此同时,其他弹出窗口工作正常。
罪魁祸首证明是一个图像标签。模板系统动态生成图像src =值,丢失的图像导致带有空src子句的图像标记(
我认为这与IE将空src-tag解释为不安全的URL并在弹出窗口中隔离会话而不通知用户有关。
答案 11 :(得分:0)
我遇到了类似的问题,使用会话变量将值传递给弹出窗口。我最后将值写入持久性cookie,然后在弹出窗口中读取cookie。这可能不适用于您使用表单身份验证时遇到的问题,但如果只是使用会话变量将某些值传递给IE8中的窗口,那么持久性cookie似乎对我有用。
编辑:另见this thread
答案 12 :(得分:0)
您还可以使用LocalStoprage方法重置父窗口中的值。 localStorage(&#34; Key&#34;)=&#34; Value&#34 ;; // Javascript