ASP.net会话cookie丢失或删除

Joe*_*oel 7 asp.net cookies session internet-explorer

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

  • 在运行IE7和项目经理的笔记本电脑运行IE7时,我的旧笔记本电脑上的问题是100%可重复的.在运行FF的当前笔记本电脑上运行IE7或任何这些笔记本电脑时,问题都不会发生.
  • 问题仅发生在生产中 - 而不是在开发,内部分段或客户端分段上.生产是唯一的负载平衡环境,但上面提到的可重复性使我怀疑负载平衡是一个因素.
  • 当设置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.这可能是相关的,但是在修复产生之前我将无法进行测试.

Mid*_*one 4

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

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

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

如果您使用 Velocity 进行会话,请确保您选择用于存储会话的缓存是不可逐出的。