2011-06-01 59 views
9

我正在分析几个月前离开公司的一位同事做的一个旧的asp.net网站的问题。在asp.net网站上混淆的会话

问题是我们有几次已经确定两个用户会话混在一起,所以如果例如两个用户登录,一个用户会看到其他用户的数据。由于很少发生(大约一个月左右),因此很难弄清楚哪里出了问题。

现在我已经通过他的认证码加强,它是这样的:

  1. 用户公共页面并按下输入用户名/密码在MySQL提交
  2. Page_Load在母版的代码检查数据库的用户名/密码是有效的,没有过期等,并返回一个唯一的用户ID,如果确定
  3. 页上,然后保存在这样的会议上loginpage(用于以后的注销): HttpContext.Current.Session(Consts.CCookieName_LoginUrl) = Request.RawUrl
  4. 然后,将用户ID被保存这样的:FormsAuthentication.SetAuthCookie(userid, False)
  5. 然后,执行重定向到安全区域:userid = Context.User.Identity.Name
  6. 用户数据被加载acording:Context.Response.Redirect(secureurl, False)
  7. 在安全区域的母版的Page_Init用户标识是通过读到用户ID
  8. 用户导航安全区域,即。步骤6 - 7重复
  9. 用户suddently看到其他用户的数据

我有什么错误的一些想法,但想有一些输入修改代码之前,所以请人?

+0

我们也使用asp.net表单身份验证,并且很少有这方面的报告,我们永远无法重现问题并不幸地进行调试。我希望有人可以添加更有用的东西。 – 2011-06-23 03:42:24

+1

看看这个公认的答案:http://stackoverflow.com/questions/6441182/aspx-global-instance-of-class-possible-bug-in-code-structure/6441357#6441357我相信这解决了我们的问题 – Muleskinner 2011-06-23 07:08:48

+0

你使用任何类型的缓存? – 2011-06-25 11:51:30

回答

6

这里很难说。 你配置了表单身份验证吗?

这是你必须遵循的窗体身份验证过程: 在你的web.config您设置的认证系统:

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" defaultUrl="Home.aspx" timeout="30" slidingExpiration="true" /> 
</authentication> 

<authorization> 
    <deny users="?"/> 
</authorization> 

你的登录页面(后回)检查凭证(不是你的主人页)。 如果用户是有效的,那么你设置Cookie:

FormsAuthentication.SetAuthCookie(用户ID,FALSE)

,并重定向到另一页。 现在,你必须设置你的本金在这里读的cookie:显然

protected void Application_AuthenticateRequest(Object sender, EventArgs e) { 
    if (HttpContext.Current.User != null) { 
     if (Request.IsAuthenticated == true) {  
      // Debug#1    
      FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value); 
      // In this case, ticket.UserData = "Admin"     
      string[] roles = new string[1] { ticket.UserData }; 
      FormsIdentity id = new FormsIdentity(ticket); 
      Context.User = new System.Security.Principal.GenericPrincipal(id, roles); 
      // Debug#2 
     } 
    } 
} 

,我已经简化,但是这是你必须遵循正确做事的路径。

+0

非常感谢,根据您的输入清理了我的代码(不要相信它解决了具体问题然而)。 – Muleskinner 2011-06-23 07:12:03

+0

@Muleskinner:没问题。我很高兴能以某种方式提供帮助。要解决您的特定代码,我可能需要查看代码。另一件事我忘了。你必须设置Thread.CurrentPrincipal = HttpContext.Current.User Xhalent在这里建议:http://stackoverflow.com/questions/6043100/asp-net-mvc-and-windows-authentication-with-custom-roles – LeftyX 2011-06-23 12:33:44

4

我会寻找任何不应该是静态的静态(并跨线程/请求共享东西)。

也许它根本不是认证相关的。您是否尝试将Context.User.Identity.Name值与错误的数据结果一起进行倾销?它是否也会返回错误的用户名?

当您可以保证只有一个用户在网站上处于活动状态时,您能否重现该问题?