【问题标题】:Sessions mixed up on asp.net site会话在 asp.net 网站上混杂在一起
【发布时间】:2011-06-01 11:08:13
【问题描述】:

我正在分析一个旧 asp.net 网站的问题,该网站是几个月前离开公司的一位同事创建的。

问题是我们有几次经历过两个用户会话混合在一​​起,例如,如果两个用户登录,一个用户会看到其他用户的数据。由于这种情况很少发生(大约一个月一次),因此很难弄清楚出了什么问题。

我现在已经通过他的代码进行身份验证,它是这样的:

  1. 用户在公共页面输入用户名/密码并按提交
  2. 在 Masterpage 上的 Page_Load 上,代码在 mySql 数据库中检查用户名/密码是否有效、未过期等,如果正常则返回唯一的用户 ID
  3. 然后页面将登录页面保存在会话中,如下所示(用于以后注销): HttpContext.Current.Session(Consts.CCookieName_LoginUrl) = Request.RawUrl
  4. 然后userid保存如下:FormsAuthentication.SetAuthCookie(userid, False)
  5. 然后重定向到安全区域:Context.Response.Redirect(secureurl, False)
  6. 在安全区域母版页的Page_Init 中,用户ID 被读取:userid = Context.User.Identity.Name
  7. 根据用户ID加载用户数据
  8. 用户导航安全区域,即。重复第 6 - 7 步
  9. 用户突然看到另一个用户的数据

我对出了什么问题有一些想法,但想在修改代码之前有一些意见,所以请任何人?

【问题讨论】:

  • 我们也使用 asp.net 表单身份验证并且很少报告此问题,遗憾的是我们永远无法重现该问题并对其进行调试。我希望有人可以添加一些更有用的东西。
  • 看看这个接受的答案:stackoverflow.com/questions/6441182/…我相信这解决了我们的问题
  • 您是否在使用任何类型的缓存?
  • 无缓存,在上述第 7 步中加载的用户实例已在模块中声明 - 我相信这是问题所在

标签: asp.net session authentication forms-authentication


【解决方案1】:

这里很难说。 你配置表单认证了吗?

这是表单身份验证必须遵循的过程: 在您的 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
        }
    }
}

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

【讨论】:

  • 非常感谢,根据您的输入清理了我的代码(但不要相信它解决了具体问题)。
  • @Muleskinner:没问题。我很高兴能在某种程度上提供帮助。要解决您的特定代码,我可能需要查看代码。另一件事我忘记了。您必须设置 Thread.CurrentPrincipal = HttpContext.Current.User 作为 Xhalent 在这里建议:stackoverflow.com/questions/6043100/…
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2015-08-02
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多