2013-07-10 5 views
0

세션 시간 초과 후 일부 작업을 수행하는 경우 사용자에게 "세션 만료"메시지를 표시해야하는 .NET MVC 4 응용 프로그램을 개발 중입니다..Net MVC - 전용 페이지 전용 "세션 만료"표시

매우 긴 시간 초과 및 세션 시간 단축으로 세션 인증을 사용하고 있으므로 세션이 만료되었거나 새로운 방문자인지 알 수 있습니다. 즉 세션 타임 아웃에서 새 방문자를 구분 만의

<authentication mode="Forms"> 
    <forms loginUrl="~/Login" timeout="10080" defaultUrl="~/Index" /> 
</authentication> 
<sessionState mode="InProc" timeout="20" /> 

내가 말했듯이, 및 응용 프로그램 자체에 대한 필요가 없습니다 : 이것은 내의 Web.config하는 섹션이다. 동일한 결과가 다른 것으로 달성 될 수 있다면 변경 될 수 있습니다. 의 Web.config에두고

, 나는이 (가)의 Global.asax에서 다음을 수행 할 수

protected void Session_Start(object sender, EventArgs e) 
{ 
    //if it's a new session AND the user is authenticated, then it's a session timeout 
    if (Request.IsAuthenticated) 
    { 
     if (Request.RequestContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      //... 
      //Ajax handling code 
      //... 
      //The redirect is so I can return a JsonResult with a standard object with the message 
      Response.Redirect("/GetJson?some_parameters, true); 
     } 
     else 
     { 
      Response.Redirect("/SessionExpired", true); 
     } 
    } 
} 

로그인이 필요한 웹 사이트의 개인 섹션에 대한 위대한 작품을 모두. 문제는 사용자가 로그인하고 세션 시간 제한을 기다린 다음 로그인이 필요없는 "공용"페이지를 열려고하면 "세션 만료되었습니다"라는 메시지가 계속 표시된다는 것입니다. 그게 내가 피하기를 원하는 것입니다. "세션 만료"메시지는 사용자가 로그인이 필요한 페이지에 액세스하려고하는 경우에만 표시되어야합니다.

나는 Session_Start에 플래그를 설정하려고 시도하고 Global.asax의 나중 이벤트에서 리디렉션했습니다. 그러나 나는 가변적 인 접근성 문제가 있었기 때문에 작동하지 않았다. 현재 작업에 [AllowAnonymous] 속성이 있는지 확인하려고 했으므로 리디렉션을 건너 뛸 수는 있지만 방법을 파악할 수는 없습니다. 내가 읽은 일부 대답은 내 "세션 만료"논리가 사용자 지정 특성에 있어야한다는 인상을 주었지만 이것이 올바른 접근 방법인지 여부는 알 수 없습니다.

제 질문은 .Net MVC 4의 "개인"페이지 만 "세션 만료"를 수행하는 가장 좋은 방법은 무엇입니까?

답변

1

이상하게도 속성을 사용하는 것이 이상적입니다. 더 정확하게 말하면이 속성의 이름은 "Action Filter"입니다.

인터페이스를 구현하거나 기존 인터페이스를 상속하는 ActionFilter를 만들 수 있습니다.

귀하의 경우 결과를 얻는 가장 쉬운 방법은 AuthorizeAttribute을 상속하고 해당 OnAuthorization 메서드를 재정의하는 것입니다.

이 방법을 사용하면 filterContext 속성의 HttpContext에 액세스 할 수 있습니다 : filterContext.HttpContext. 이 속성을 사용하여 세션, 권한 부여를 확인하고 아약스 요청인지 확인할 수 있습니다. 리디렉션해야하는 경우, 당신은 filterContext 매개 변수의 속성을 설정하여 작업을 수행해야합니다

filterContext.Result = new RedirectResult("...url to redirect to..."); 

당신은 RedirectResult 또는 RedirectToRouteResult 생성자의 오버로드를 사용할 수 있습니다.

Result 속성을 그대로두면 특별한 일은 발생하지 않습니다.

원래 승인 속성 대신이 사용자 정의 속성을 사용할 수 있습니다.

+0

조치 필터에서이 요청으로 세션이 방금 작성된 것인지 알 수있는 방법이 있습니까? 그렇지 않은 경우 ... 사용자가 새로운 방문자이거나 만료 된 세션이있는 이전 방문자인지 어떻게 알 수 있습니까? – FercoCQ

+0

플래그 역할을하는 사용자 정의 쿠키를 사용할 수 있습니다. 이 쿠키를 처리하기 위해 전역 작업 필터를 등록 할 수 있습니다. 사용자 지정 쿠키가 요청에없고 세션에 세션이있는 경우 쿠키를 "새 세션"으로 설정하십시오. 쿠키가 이미 요청에 존재하고 세션이 활성 상태라면 "이전 세션"으로 변경하십시오. 쿠키가 있지만 세션이 만료 된 경우이를 "이전 세션 만료"로 플래그하십시오. 이런 식으로 정확히 할 필요는 없습니다. 단지 할 수있는 일의 스케치 일뿐입니다. – JotaBe

+0

고마워, 나는 며칠 후에 그것을 시도 할 것이고 그것이 어떻게 진행되는지 알려줄 것이다. – FercoCQ

관련 문제