2012-08-24 3 views
3

사람들이 비슷한 문제를 가지고 있지만 작동하는 해결책을 찾지 못한 수많은 게시물을 읽었습니다. MVC 4 사이트를 가지고 있으므로 페이지를 캐시하려는 전체 웹 사이트에서 캐싱을 제거하고 싶지 않습니다. 사용자가 로그 오프 버튼을 클릭하면 성공적으로 로그 오프하고 로그인 페이지로 리디렉션됩니다. 그러나 사용자가 뒤로 버튼을 클릭하면 로그인 한 경우에만 볼 수있는 이전에 본 "제한된 페이지"가 ​​표시됩니다. 이는 브라우저가 페이지 클라이언트 측을 캐시했기 때문입니다. 나는 여러 가지 해결책을 시도해 왔으며 앞서 언급 한 것처럼 그들 중 누구도 일하지 않는다. 현재 내 로그 오프 다음과 같은 코드가 있습니다MVC 4 - 로그 아웃 후 뒤로 버튼 문제

public ActionResult LogOff() 
    { 

     FormsAuthentication.SignOut(); 
     Session.Abandon(); 
     Session.Clear(); 

     // clear authentication cookie 
     HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, ""); 
     cookie1.Expires = DateTime.Now.AddYears(-1); 
     Response.Cookies.Add(cookie1); 

     // clear session cookie (not necessary for your current problem but i would recommend you do it anyway) 
     HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", ""); 
     cookie2.Expires = DateTime.Now.AddYears(-1); 
     Response.Cookies.Add(cookie2); 

     // Invalidate the Cache on the Client Side 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
     Response.Cache.SetNoStore(); 

     Response.AppendHeader("Pragma", "no-cache"); 

     // send an expired cookie back to the browser 
     var ticketExpiration = DateTime.Now.AddDays(-7); 
     var ticket = new FormsAuthenticationTicket(
      1, 
      // replace with username if this is the wrong cookie name 
      FormsAuthentication.FormsCookieName, 
      DateTime.Now, 
      ticketExpiration, 
      false, 
      String.Empty); 
     var cookie = new System.Web.HttpCookie("user") 
     { 
      Expires = ticketExpiration, 
      Value = FormsAuthentication.Encrypt(ticket), 
      HttpOnly = true 
     }; 

     Response.Cookies.Add(cookie); 

     return RedirectToAction("Login", "Account"); 
    } 
+0

나는 당신이 당신의 인증을 어떻게하고 있는지 모른다. 그러나 모든 웹 사이트에서 사용자가 사이트에 올 수있는 적절한 인증을 받았는지 확인하기 위해 데이터베이스를 확인하지 않아야합니까? 그리고 그렇지 않다면, 그것은 뭔가를 디스플레이에 리다이렉트해야한다. 페이지가 캐싱 된 경우에도 스크립트는 계속 실행되며 db에 저장된 사용자 세션에 로그 오프 되었음이 표시되어야합니다. – AwDogsGo2Heaven

+0

물론 작동하지 않을 것입니다. 만료 코드는 * 현재 * 요청이 캐시되는지 여부에만 영향을줍니다. 현재 요청은 로그 오프 코드이므로 로그 오프 페이지 만 캐시되지 않습니다. 캐싱 된 페이지는 소급하여 다시 제거 할 수 없습니다. –

답변

0

당신은 포스트 백에 아약스 요청을 트리거하기 위해, 브라우저 창에서 해시 변경 이벤트를 사용할 수를,이 분명히 당신의 로그 아웃으로 실패합니다. 거기에서 당신이 좋아하는 무엇이든 할 브라우저를 실행시킬 수 있습니다.

4

모든 페이지에서 "브라우저에 다시 캐시하지 않음"동작을 적용하려면 global.asax에 다음을 입력해야합니다.

protected void Application_BeginRequest() 
{ 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1)); 
    Response.Cache.SetNoStore(); 
} 

누군가에게 도움이되기를 바랍니다.

0

아래 코드 줄을 Global.asax.cs 파일에 추가하십시오.

protected void Application_BeginRequest() 
{ 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1)); 
    Response.Cache.SetNoStore(); 
}