我有一个MVC 3项目,它通过表单身份验证对用户进行身份验证。
要在身份验证后需要时访问用户的不同信息,我已经实现了一个简单的类:
public class ComplexUserData
{
public static string complexAccountName;
public static string complexRole;
...
...
}
在每个页面请求中,控制器会查找此对象,并在需要时将数据填充到属性中。
另一方面:
登录过程如下:
HttpContext.User.Identity.Name
是否为空注销过程如下:
FormsAuthentication.SignOut();
Session.Abandon();
HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName,“”);
cookie1.Expires = DateTime.Now.AddYears(-1); Response.Cookies.Add(COOKIE1);
HttpCookie cookie2 = new HttpCookie(“ASP.NET_SessionId”,“”);
cookie2.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(COOKIE2);
重定向到LogOn
在我的母版页中,我在顶部栏中使用SessionData.complexAccountName
。在用户测试之前,一切似乎都很好。
用户A表示,他将页面闲置一段时间然后从系统中退出后,网站将返回主页面,并在顶部栏上显示用户B.与此同时,用户B做了同样的事情,并在顶栏上看到了用户A.
所以我假设当用户注销并重定向到登录页面时,正如进程所指示的那样,控制器会检查HttpContext.User.Identity.Name
,而它应该为null,但它不是! 实际上它拥有另一个用户的名字!
我做错了什么,系统为什么表现得很奇怪。
提前致谢并致以最诚挚的问候。
答案 0 :(得分:0)
您的代码使用static
字段:
public class ComplexUserData
{
public static string complexAccountName;
...
这样的static
字段由所有线程共享,因此所有用户都在处理相同的数据(!)这非常危险。
static
可能是最危险的关键字,因为代码可以工作但在多线程场景中很奇怪,并且可能会将信息泄露给其他方。
解决方案: 除非你真正理解它的作用,否则不要使用静态。切勿在静态变量中存储每个用户,每个请求或类似的信息。将所有用户信息存储在会话中,数据库或类似的数据存储中。