Должен ли я использовать Session.Abandon () в моем методе LogOff? - PullRequest
3 голосов
/ 15 февраля 2011

Технологии, которые я использую:

  • MVC v2
  • Аутентификация с помощью форм (истечение срока действия)
  • Сервер состояния сеанса
  • Настраиваемый атрибут авторизации

Я использую процесс сервера состояний для моего приложения MVC.Во время тестирования, когда аутентифицированный пользователь нажимает кнопку «LogOff», он корректно выводит их на экран аутентификации и при успешном вводе учетных данных регистрирует их снова. НО, он находит свое предыдущее состояние переменной сеанса, а НЕперезагрузите все новые разрешения, которые я им дал.Это связано с тем, как я загружаю пользователя в следующем коде:

public override void OnAuthorization(AuthorizationContext filterContext) {

        if (filterContext == null)
            throw new ArgumentNullException("FilterContext");

        if (AuthorizeCore(filterContext.HttpContext)) {
            IUser customUser = filterContext.HttpContext.Session["CustomUser"] as IUser;

            if ((customUser == null) || (customUser.Name != filterContext.HttpContext.User.Identity.Name)) {
                customUser = new User(filterContext.HttpContext.User.Identity.Name,
                                      filterContext.HttpContext.User.Identity.IsAuthenticated);
            }

            if (_privileges.Length > 0) {
                if (!customUser.HasAtLeastOnePrivilege(_privileges))
                    filterContext.Result = new ViewResult { ViewName = "AccessDenied" };
            }

            filterContext.HttpContext.Session["CustomUser"] = customUser;
        }
    }

Итак, вы можете видеть, что я храню мой customUser в Session, и это значение является тем, что было выбраноиз предыдущего сеанса, даже если пользователь вышел из системы (но вошел обратно в скользящее окно истечения срока действия.

Итак, мой вопрос, должен ли я сделать простой вызов Session.Abandon() в моем методе LogOffв AccountController, или есть более выгодный способ справиться с этим?

1 Ответ

7 голосов
/ 15 февраля 2011

Обычно Session.Clear() должно быть достаточно и удалить все значения, которые были сохранены в сеансе. Session.Abandon() заканчивает текущий сеанс. Он также может запустить Session_End, и следующий запрос вызовет Session_Start.

...