2009-06-18 3 views
3

기본적으로 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, OnActionExecutedOnResultExecuting도 시도했지만 항상 거짓입니다.

우아한 해결책이 있습니까? 아니면 컨트롤러에서 세션 변수를 직접 포기해야합니까?

답변

0

User.Identity.IsAuthenticated가 다음 페이지 요청 때까지 true 였기 때문에 비슷한 문제가 있었지만 사용자가 실제로 응용 프로그램 작업을 마쳤는지 알 수있는 방법이 필요했습니다.

컨트롤러에 Session 또는 ViewData 변수를 설정하거나 routeValues를 통해 다른 컨트롤러로 전달해야한다고 생각합니다.

+0

답장을 보내 주셔서 감사합니다. 예, 컨트롤러에서 세션을 설정할 수는 있지만 피하려고했습니다. 나는 아직도 그것에 대한 실행 가능한 대안이 있기를 희망한다. – Razzie