2013-09-10 3 views
0

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

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

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

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

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

Процесс Логин идет как:

  1. LogOn страница запрашивается
  2. До возвращения LogOn View, контроллер проверяет, если HttpContext.User.Identity.Name не является нулевым
  3. Если он не является нулевым, найдите пользователя с этим именем пользователя и перенаправите его на нужную целевую страницу
  4. Else возвращает страницу LogOn

И процесс выхода из системы идет как:

  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 в верхней панели. Все кажется прекрасным, пока пользователь не проверит.

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

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

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

Заранее благодарен.

ответ

0

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

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

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

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

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

+0

Хорошо, я исправлю это. Но как насчет проблемы HttpContext? В 'HttpContext.User.Identity.Name' есть другое имя пользователя. –

+0

У меня нет всего вашего кода, и я считаю, что этот процесс является недостатком в целом. Должен быть некоторый момент, когда вы назначаете значение 'HttpContext.User'. – mnemosyn