ASP.net会话cookie丢失或删除

时间:2010-02-05 16:35:13

标签: asp.net internet-explorer session cookies

我有一个ASP.NET 2.0站点,它在会话中存储用户的ID以表明他们已登录。在某些情况下,用户似乎没有保持登录状态。我一直在监视Fiddler中的流量,以及我发现的一些细节:

  • 在运行IE7时运行IE7和项目经理的笔记本电脑时,我的旧笔记本电脑上的问题是100%可重复的。当前运行IE7的笔记本电脑或任何这些笔记本电脑在运行FF时都不会出现此问题。
  • 问题仅发生在生产中 - 而不是在开发,内部登台或客户端登台时。生产是唯一的负载平衡环境,但上面提到的可重复性使我将负载平衡视为一个因素。
  • 当设置Session(“ID”)= 1的页面向客户端发送响应时,我可以在所有情况下看到“Set-Cookie”标题,这是创建ASP.Net_Session_Id cookie(并且它是HttpOnly )。
  • 对服务器的后续请求将在未显示问题的计算机上的标头中发送该cookie,但不会在计算机上发送,因此要么删除cookie,要么忽略“Set-Cookie”标头。
  • 登录的方式如下:www.DomainX.com上的页面有一个iframe。 iframe的来源是login.DomainY.com上的一个页面。 login.DomainY.com提供的各种页面引导用户完成登录/注册过程。 login.DomainY.com的最后一步是重定向到www.DomainX.com上的页面,包括查询字符串中的用户ID。 www.DomainX.com上的此页面通常将ID存储在会话中,然后运行一些JS以将顶级文档重定向到新页面,从而将用户从iframe中取出。这是一个已经工作了几年的过程,具有DomainX.com的几个值。这里可能有所不同的一点是,在这种情况下,JS只是破坏了iframe,还有一些包含了div。
  • 我发现问题发生的情况与不存在问题的情况之间的另一个区别在于Google Analytics(分析)Cookie。 login.DomainY.com/FinalStep.aspx将其重定向到iframe内的www.DomainX.com/SaveTheID.aspx有所不同。如果没有出现此问题,SaveTheID.aspx请求会包含各种Google Analytics Cookie(__ utma,__ utmz等)。当问题确实发生时,此请求不包括所有GA cookie(它缺少__utma,__ utmz和__utmb)。
  • 生产是login.DomainY.com在SSL下运行的唯一环境,所以我认为这可能是相关的。但我们暂时设置login.DomainY.com的暂存副本以使用SSL,但这没有效果。

任何可能导致此问题的想法?

编辑:生产环境包含www.DomainX.com和DomainX.com的域。还存在另一个已知问题,即没有为这两个域设置cookie。这可能是相关的,但是在修复产生之前我将无法进行测试。

3 个答案:

答案 0 :(得分:4)

您需要查看会话状态提供程序,以查看它是否可以在.net应用程序的两个服务器/实例上运行。如果它们被设置为例如inProc,那么你肯定会遇到这个问题,因为每个会话都将绑定到创建它的线程。相反,您希望将其抽象为两台计算机都可以访问的asp.net状态服务,或者甚至更好地使用分布式缓存解决方案,例如Microsoft Velocity项目,它将在两台计算机上分配会话以防万一发生故障。

处理此问题的其他一些方法是在负载均衡器上使用粘性会话(不推荐)或转移到无cookie的会话,这可能有效,但可能会导致代码中的一些麻烦。

在我们的业务中,我们有一个主服务器和辅助服务器,后面有分布式缓存,这样如果一台机器发生故障,另一台机器可以接管。同样的原则适用于负载平衡,一旦您开始在应用程序池中拥有多台计算机或甚至多个实例,您就必须为此进行编码。

如果您使用Velocity进行会话,请务必确保您选择用于存储会话的缓存不可删除。

答案 1 :(得分:0)

我认为Middletone是对的,除了:它没有解释为什么这个问题不能用Firefox重新编写。负载均衡器是第一号犯罪嫌疑人;通过将除了一个应用服务器之外的所有服务器脱机(如果可行,并且在它可以处理负载的时间)并且看看问题是否仍然存在,看它是否有一个不在犯罪现场是很好的。如果是这样,它不是负载均衡器,您可以开始寻找其他地方。如果没有,那就是负载均衡器。

BTW:粘性会话很糟糕,因为其上的会话不受冗余保护。此外,负载均衡器无法在某个时间点分配给负载最小的服务器,它只能在会话开始时决定,然后将用户保留在他/她所在的位置。

如果事实证明你在这里遇到了负载均衡器问题,那么我要做的第一件事就是启用会话粘性,然后可能会找到另一个解决方案,其中包含工作生产环境的舒缓背景。

答案 2 :(得分:0)

拍摄,我必须丢失我的cookie以及回复和编辑的能力......

我确实通过修改我的hosts文件直接指向每个Web服务器的IP来探索负载均衡器作为问题,并且没有任何影响。我认为客户的IT人员不愿意要求关闭负载平衡。

我们确实有一个单独的状态服务器正在运行,它与在同一服务器托管的其他站点上使用了几年相同。不一定没有问题,但没有这样的问题。

作为创可贴,我正在测试其他持久性机制......