我正在分析几个月前离开公司的一位同事所做的旧asp.net网站的问题。
问题是我们有几次看到两个用户会话混淆了,所以如果例如两个用户登录,则一个用户看到其他用户数据。因为它很少发生(一个月左右),很难弄清楚出了什么问题。
我现在已经介绍了他的身份验证代码,它是这样的:
Page_Load
上,代码在mySql数据库中检查用户名/密码是否有效,未过期等,如果确定则返回唯一的用户ID HttpContext.Current.Session(Consts.CCookieName_LoginUrl) = Request.RawUrl
FormsAuthentication.SetAuthCookie(userid, False)
Context.Response.Redirect(secureurl, False)
Page_Init
中,用户ID由以下内容读取:userid = Context.User.Identity.Name
我对出了什么问题有一些想法,但是在修改代码之前想要一些输入,所以请任何人?
答案 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
值与错误的数据结果一起转储?它是否也会返回错误的用户名?
如果您可以保证网站上只有一个用户处于活动状态,您能否重现该问题?