0

我有一个 MVC 3 项目,它通过表单身份验证对用户进行身份验证。

为了在身份验证后需要时访问用户的不同信息,我实现了一个简单的类:

public class ComplexUserData
{
   public static string complexAccountName;
   public static string complexRole;
   ...
   ...
}

在每个页面请求上,控制器都会查看此对象并在需要时将数据填充到属性中。

另一方面:

登录过程如下:

  1. 请求登录页面
  2. 在返回 LogOn View 之前,控制器检查是否HttpContext.User.Identity.Name不为空
  3. 如果不为空,则使用该用户名查找用户并重定向到正确的登录页面
  4. 否则返回登录页面

注销过程如下:

  1. FormsAuthentication.SignOut();

    会话.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);

  2. 重定向到登录

在我的母版页中,我SessionData.complexAccountName在顶部栏中使用。在用户测试之前,一切似乎都很好。

用户 A 说,在他让页面闲置一段时间然后从系统注销后,站点返回到主页,并在顶部栏显示用户 B。与此同时,用户 B 做了同样的事情,在顶栏上看到了用户 A。

所以我假设当用户注销并重定向到登录页面时,正如流程所示,控制器会检查HttpContext.User.Identity.Nameand 虽然它应该为空,但它不是!实际上它拥有另一个用户的名字

我做错了什么,为什么系统表现得很奇怪。

提前致谢并致以最诚挚的问候。

4

1 回答 1

0

您的代码使用static字段:

public class ComplexUserData
{
  public static string complexAccountName;
  ...

这样一个static字段由所有线程共享,因此所有用户都在处理相同的数据(!)这是非常危险的。

static可能是最危险的关键字,因为代码可以工作,但在多线程场景中会奇怪地失败,并且可能会将信息泄露给其他方。

解决方案:除非您真正了解它的作用,否则不要使用静态。永远不要将每个用户、每个请求或类似信息存储在静态变量中。将所有用户信息存储在会话、数据库或类似的数据存储中。

于 2013-09-10T14:24:08.720 回答