我们在Web服务器日志中观察到一些奇怪的行为,其中当前登录用户的身份似乎与另一个用户交换。在进一步解释之前,我将描述我们的设置。
我们在2台Windows 2008 Web服务器上运行asp.net网站(框架的v3.5)并使用表单身份验证。它们使用在Linux上运行Apache 2.2的单独服务器(Cent OS 5)进行负载平衡。负载平衡只是将cookie附加到用户,并将它们定向到特定服务器以用于每个后续请求。
我们偶尔会注意到日志中的模式(详细信息模糊)
首次登录
UserName - customer1@x.com
UserId - 1111
网页 - 第1页
IP - ip1
时间 - 2010-06-29 12:56:20.750
SessionId - h3uyz2fsdfegugjy452sdz0far
第二次日志条目
UserName - customer1@x.com
UserId - 2222
网页 - 第2页
IP - ip2
时间 - 2010-06-29 12:57:16.133
SessionId - 21ipjsdfsdfieqqwyfdokgqsb55
我们使用标准的asp.net表单身份验证框架(标准登录控件,我们实现了自定义成员资格提供程序)使用表单身份验证。
UserName是使用“HttpContext.Current.User.Identity.Name”检索的Windows标识UserId是会话中设置的数据库Id。使用“HttpContext.Current.Session.SessionID”
检索sessionId正如您所看到的,对于2个不同的用户,在不同的IP地址和不同的会话ID下,相同的Windows身份是相同的,大约在同一时间点击该站点。我们检查过,IP来自完全不同的位置。错误的Windows身份似乎被记录下来了。 UserId 2222应该记录不同的用户名。
由于偶尔会发生这种情况,因此代码是标准的,并且在一段时间内没有发生实质性变化,我们不会“认为”这是编码错误。我们假定负载均衡器存在问题或Web服务器存在问题。我以前从未在asp.net中听说过这样的问题。
最近,我们确实将我们在Windows 2003上的IIS6和思科硬件负载均衡器的设置更改为Windows 2008上IIS7的当前设置和Apache负载平衡。任何想法都赞赏。
web.config中的表单身份验证条目是
身份验证模式=“表单”
表单loginUrl =“LoginPage.aspx”name =“。ASPXFORMSAUTH”
答案 0 :(得分:0)
您是否设置了任何会话变量?每个请求的会话ID都会重置,除非您为每个用户在会话中存储某些内容,。
答案 1 :(得分:0)
您必须保证每个用户cookie都是唯一的。你不能依赖于sessionid。