IE 快取設定檢查

  • 398
  • 0

IE 檢查儲存的畫面是否有較新的版本 設定為永不的時候,該如何克服IE一直取得Cache內的舊資料

專案架構:ASPNET MVC5

最近客戶再使用IE的時候,有時候導回登入頁的時候,客戶就無法登入成功。

為了避免跨網站攻擊(CSRF),在登入頁很自然地使用 AntiForgeryToken,

但是使用@Html.AntiForgeryToken的時候,會再產出頁面(View)的原始碼以Hidden欄位放置Token,

並且也會產生"Cookie"去存 Request Verification Token。

後來發現部分的使用者IE的設定 檢查儲存的畫面是否有較新的版本 設為 永不

 

參考了一下暗黑大的文章

使用者設定Never(永不)的時候,IE從不檢查更新內容,一律使用快取,除非使用者按下F5或者是重新整理網頁,

那這個時候重新導回登入頁的Cookie有可能就帶到Cache內的資料,

對Server來說,要使用ValidateAntiForgeryToken去檢查就一定會過不了,

導致使用者重新登入失敗,一定要關閉IE再重新開啟IE之後,才會取到正確的Cookie。

 

解決方法是在登入的Action加入 NoCache的設定

設定的方法可參考這個網站

或者是自己寫一個  NoCacheAttribute

public class NoCacheAttribute : ActionFilterAttribute
{
	public override void OnResultExecuting(ResultExecutingContext filterContext)
	{
		filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
		filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
		filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
		filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
		filterContext.HttpContext.Response.Cache.SetNoStore();

		base.OnResultExecuting(filterContext);
	}
}

然後再Login的Action加上這個ActionFilter

也可以參考暗黑大的文章最後提到的:使用JavaScript,載入網頁後再更新或檢查隨機內容。