기본적으로 ASP.NET MVC 샘플에서 AccountController를 사용하고 있습니다. FormsAuthentication을 사용하여 사용자 로그인을 처리합니다. 당신이 주석 라인에서 볼 수 있듯이User.Identity.IsAuthenticated ActionFilter 로그인 후 바로 확인
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 변수를 직접 설정하는 가장 우아한 방법이 아니라고 생각했습니다. 유닛 테스트가이 메소드를 테스트 할 때 불편한 점도 있습니다. (물론 조롱 할 수는 있지만 여전히 그렇습니다.)
그래서이 로그인 루틴 이후에 실행되는 사용자 지정 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
도 시도했지만 항상 거짓입니다.
우아한 해결책이 있습니까? 아니면 컨트롤러에서 세션 변수를 직접 포기해야합니까?
답장을 보내 주셔서 감사합니다. 예, 컨트롤러에서 세션을 설정할 수는 있지만 피하려고했습니다. 나는 아직도 그것에 대한 실행 가능한 대안이 있기를 희망한다. – Razzie