Я в основном использую 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
, но это всегда неверно.
Есть ли элегантное решение вокруг этого? Или я должен отказаться и установить переменную сеанса непосредственно в контроллере?