会话在asp.net网站上混淆了

时间:2011-06-01 11:08:14

标签: asp.net session authentication forms-authentication

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

问题是我们有几次看到两个用户会话混淆了,所以如果例如两个用户登录,则一个用户看到其他用户数据。因为它很少发生(一个月左右),很难弄清楚出了什么问题。

我现在已经介绍了他的身份验证代码,它是这样的:

  1. 用户在公共页面上输入用户名/密码,然后按提交
  2. 在主页上的Page_Load上,代码在mySql数据库中检查用户名/密码是否有效,未过期等,如果确定则返回唯一的用户ID
  3. 然后页面将登录页面保存在这样的会话中(用于以后的注销): HttpContext.Current.Session(Consts.CCookieName_LoginUrl) = Request.RawUrl
  4. 然后用户ID保存如下:FormsAuthentication.SetAuthCookie(userid, False)
  5. 然后执行重定向到安全区域:Context.Response.Redirect(secureurl, False)
  6. 在安全区域主页的Page_Init中,用户ID由以下内容读取:userid = Context.User.Identity.Name
  7. 根据用户标识加载用户数据
  8. 用户导航安全区域,即。重复步骤6-7
  9. 用户突然看到其他用户数据
  10. 我对出了什么问题有一些想法,但是在修改代码之前想要一些输入,所以请任何人?

2 个答案:

答案 0 :(得分: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(userid,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
        }
    }
}

显然,我已经简化了,但这是你必须遵循的正确道路。

答案 1 :(得分:4)

我会寻找任何不应该是静态的静态(并在线程/请求之间共享内容)。

也许这与身份验证无关。您是否尝试将Context.User.Identity.Name值与错误的数据结果一起转储?它是否也会返回错误的用户名?

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