奇怪的HttpContext.User.Identity问题

时间:2013-09-10 13:54:04

标签: asp.net-mvc-3 httpcontext

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

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

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

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

另一方面:

登录过程如下:

  1. 请求登录页面
  2. 在返回LogOn View之前,控制器会检查HttpContext.User.Identity.Name是否为空
  3. 如果不为空,请找到具有该用户名的用户并重定向到正确的目标网页
  4. 否则返回LogOn页面
  5. 注销过程如下:

    1. 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);

    2. 重定向到LogOn

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

      用户A表示,他将页面闲置一段时间然后从系统中退出后,网站将返回主页面,并在顶部栏上显示用户B.与此同时,用户B做了同样的事情,并在顶栏上看到了用户A.

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

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

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

1 个答案:

答案 0 :(得分:0)

您的代码使用static字段:

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

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

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

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