Странная проблема HttpContext.User.Identity

У меня есть проект MVC 3, который аутентифицирует пользователей с помощью аутентификации с помощью форм.

Чтобы получить доступ к различной информации пользователя, когда это необходимо после аутентификации, я реализовал простой класс:

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

При каждом запросе страницы контроллер смотрит на этот объект и при необходимости заполняет данные для свойств.

С другой стороны:

Процесс входа в систему выглядит следующим образом:

  1. Запрашивается страница входа в систему
  2. Перед возвратом LogOn View контроллер проверяет, не равно ли HttpContext.User.Identity.Name null
  3. Если он не равен нулю, найдите пользователя с этим именем пользователя и перенаправьте его на правильную целевую страницу.
  4. В противном случае верните страницу входа в систему

И процесс выхода из системы выглядит следующим образом:

  1. FormsAuthentication.SignOut ();

    Session.Abandon ();

    HttpCookie cookie1 = новый HttpCookie (FormsAuthentication.FormsCookieName, "");

    cookie1.Expires = DateTime.Now.AddYears (-1); Response.Cookies.Add (cookie1);

    HttpCookie cookie2 = новый HttpCookie ("ASP.NET_SessionId", "");

    cookie2.Expires = DateTime.Now.AddYears (-1);

    Response.Cookies.Add (cookie2);

  2. Перенаправить на LogOn

На моей главной странице я использую SessionData.complexAccountName на верхней панели. Все в порядке до пользовательского тестирования.

Пользователь A говорит, что после того, как он оставил страницу на некоторое время бездействующей, а затем вышел из системы, сайт вернется на главную страницу с отображением пользователя B на верхней панели. В то же время пользователь B сделал то же самое и увидел пользователя A на верхней панели.

Поэтому я предполагаю, что когда пользователи выходят из системы и перенаправляются на страницу входа в систему, как указывает процесс, контроллер проверяет HttpContext.User.Identity.Name, и хотя он должен быть нулевым, это не так! На самом деле он содержит имя другого пользователя!

Что я делаю не так, почему система ведет себя странно.

Заранее спасибо и с наилучшими пожеланиями.


person Kadir.K    schedule 10.09.2013    source источник


Ответы (1)


В вашем коде используются static поля:

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

Такое поле static используется всеми потоками, поэтому все пользователи работают с одними и теми же данными (!) Это очень опасно.

static, вероятно, является наиболее опасным ключевым словом, потому что код работает, но в многопоточном сценарии странным образом не работает и может передавать информацию другим сторонам.

Решение: не используйте статику, если вы действительно не понимаете, что она делает. Никогда не храните информацию о пользователях, запросах или аналогичную информацию в статических переменных. Храните всю информацию о пользователе в сеансе, в базе данных или аналогичном хранилище данных.

person mnemosyn    schedule 10.09.2013
comment
Хорошо, я исправлю это. Но как насчет проблемы с HttpContext? В HttpContext.User.Identity.Name .. есть другое имя пользователя. - person Kadir.K; 10.09.2013
comment
У меня нет всего вашего кода, и я считаю, что процесс в целом некорректен. Должна быть какая-то точка, в которой вы присваиваете значение HttpContext.User. - person mnemosyn; 10.09.2013