Проверьте User.Identity.IsAuthenticated в ActionFilter сразу после входа - PullRequest
4 голосов
/ 18 июня 2009

Я в основном использую AccountController из примеров ASP.NET MVC. Он использует FormsAuthentication для обработки входа пользователя. Просто чтобы быть уверенным, вот код для обработки входа пользователя:

    public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
    {
      if (!ValidateLogOn(userName, password))
      {
        return View();
      }

      FormsAuth.SignIn(userName, rememberMe);


      //Session["userId"] = 1;


      if (!String.IsNullOrEmpty(returnUrl))
      {
        return Redirect(returnUrl);
      }
      else
      {
        return RedirectToAction("Index", "Home");
      }
    }

Как видно из закомментированной строки, я хотел бы установить переменную Session в этом методе. Однако я понял, что это не самый элегантный способ установки переменной Session непосредственно в контроллере. Это также неудобно при модульном тестировании этого метода (хотя я мог бы издеваться над ним, конечно, но все же).

Итак, я решил, что я создаю собственный ActionFilterAttribute, который запускается после этой процедуры входа в систему. Если вход успешен, установите переменную сеанса в этом пользовательском атрибуте. Код для этого:

  public class SetSessionAttribute : ActionFilterAttribute
  {
    public override void OnResultExecuted(ResultExecutedContext resultContext)
    {      
      if (resultContext.HttpContext.User.Identity.IsAuthenticated)
      {
        resultContext.HttpContext.Session["userId"] = 1;
      }

      base.OnResultExecuted(resultContext);
    }
  }

Проблема в том, что User.Identity.IsAuthenticated всегда возвращает false до следующей «загрузки страницы». Я переопределяю OnResultExecuted, так как понимаю, что это последний метод, который будет вызван в жизненном цикле страницы, но не повезло. Я также пытался OnActionExecuting, OnActionExecuted и OnResultExecuting, но это всегда неверно.

Есть ли элегантное решение вокруг этого? Или я должен отказаться и установить переменную сеанса непосредственно в контроллере?

1 Ответ

0 голосов
/ 19 июня 2009

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

Я думаю, вы должны установить переменную Session или ViewData в контроллере или передать ее другому контроллеру через routeValues.

...