ASP.net会话cookie丢失或删除

我有一个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 cookies(它缺少__utma,__utmz和__utmb)。
  • 生产是login.DomainY.com在SSL下运行的唯一环境,所以我认为这可能是相关的。 但是我们暂时将login.DomainY.com的登台副本设置为使用SSL,并且没有任何效果。
  • 任何想法可能导致这种情况?

    编辑:生产环境具有www.DomainX.com和DomainX.com的域。 还有另一个已知的问题,即没有为这两个域设置Cookie。 这可能与此有关,但在修复版本发布之前我无法进行测试。


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

    处理这个问题的一些其他方法是在负载平衡器上使用粘性会话(不推荐)或移动到无cookie的会话,这会工作,但可能会在代码中造成一些麻烦。

    在我们的业务中,我们有一台主服务器和一台辅助服务器,后面有一个分布式缓存,这样如果一台机器停机,另一台机器可以接管。 同样的原则也适用于负载均衡,一旦你开始在应用程序池中拥有多台机器甚至多个实例,你将不得不为此编写代码。

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


    我认为Middletone是正确的,除了:它不能解释为什么这个问题不能用Firefox来谴责。 负载均衡器是第一嫌疑犯; 通过除了一个应用服务器之外的所有应用服务器离线(如果可行的话,并且在它可以处理负载的时间内),并且看问题是否仍然存在,那么看看它是否得到了别名是很好的。 如果是这样,它不是负载平衡器,你可以开始寻找其他地方。 否则,它是负载平衡器。

    顺便说一下:粘滞会话不好,因为它上面的会话不受冗余保护。 此外,负载均衡器无法在某个时间点分发给负载最轻的服务器,只能在会话开始时决定,然后将用户保留在他/她所在的位置。

    如果事实证明您在这里遇到了负载均衡问题,那么我要做的第一件事就是开启会话粘性,然后可能会寻找另一种解决方案,使其适应生产环境的舒缓背景。


    拍摄,我必须丢失我的cookie并且能够回复和编辑...

    通过修改我的主机文件,直接指向每个Web服务器的IP地址,我确实将负载平衡器作为问题进行了探索,但这没有任何影响。 我认为客户的IT人员会不约而同地要求关闭负载平衡。

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

    作为一种创可贴,我目前正在测试其他的持久性机制......

    链接地址: http://www.djcxy.com/p/44563.html

    上一篇: ASP.net session cookie lost or deleted

    下一篇: Getting a list of Library objects?