首先講一下授權
首先AuthorizeAttribute 這個Filter實現了IAuthorization這個接口,是Asp.Net MVC提供的認證和授權功能的實現,要實現自己的認證和授權功能只需要繼承AuthorizeAttribute,然後覆蓋它的方法就可以了 。
public class MyAuthAttribute : AuthorizeAttribute
{
//do something
}
首先重寫 AuthorizeAttribute的OnAuthorization 方法,代碼如下:
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (!AuthorizeCore(filterContext.HttpContext))
{
HandleUnauthorizedRequest(filterContext);
}
else
{
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
}
}
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
這句代碼就是清除緩存的關鍵。
AuthorizeAttribute的OnAuthorization方法內部調用了AuthorizeCore方法,這個方法是實現驗證和授權邏輯的地方,如果這個方法返回true,
表示授權成功,如果返回false, 表示授權失敗, 會給上下文設置一個HttpUnauthorizedResult,這個ActionResult執行的結果是向瀏覽器返回
一個401狀態碼,但是通常還是跳轉到一個登錄頁面,可以重寫AuthorizeAttribute的
HandleUnauthorizedRequest 方法 :
protected override void HandleUnauthorizedRequest(AuthorizationContext context)
{
if (context == null)
{
throw new ArgumentNullException("filterContext is null");
}
else
{
string path = context.HttpContext.Request.Path;
string strUrl = "/Account/LogOn?returnUrl={0}";
context.HttpContext.Response.Redirect(string.Format(strUrl, HttpUtility.UrlEncode(path)), true);
}
}
---------------------------------------------------------
也可單獨提取出來清除緩存:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MobileMvc.Models
{
public class NoCacheAttribute : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
base.OnResultExecuted(filterContext);
}
}
}
如此,不需要Cache的Action,簡單的加上Filter即可:.
[NoCache]
public ActionResult PostSomething()
{
//do something...
}