AuthorizeAttribute
AuthorizeAttribute 這個Filter實現了IAuthorization這個接口,是Asp.Net MVC提供的認證和授權功能的實現,要實現自己的認證和授權功能
只需要繼承AuthorizeAttribute,然后覆蓋它的方法就可以了 .
{
...
...
}
首先重寫 AuthorizeAttribute的OnAuthorization 方法,代碼如下:
{
if (filterContext == null)
{
throw new ArgumentNullException( " filterContext ");
}
if (!AuthorizeCore(filterContext.HttpContext))
{
HandleUnauthorizedRequest(filterContext);
}
else
{
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
// HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
// cachePolicy.SetProxyMaxAge(new TimeSpan(0));
// cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
}
}
AuthorizeAttribute的OnAuthorization方法內部調用了AuthorizeCore方法,這個方法是實現驗證和授權邏輯的地方,如果這個方法返回true,
表示授權成功,如果返回false, 表示授權失敗, 會給上下文設置一個HttpUnauthorizedResult,這個ActionResult執行的結果是向瀏覽器返回
一個401狀態碼(未授權),但是返回狀態碼沒什么意思,通常是跳轉到一個登錄頁面,可以重寫AuthorizeAttribute的
HandleUnauthorizedRequest 方法 :
View Code
{
if (context == null)
{
throw new ArgumentNullException( " filterContext ");
}
else
{
string path = context.HttpContext.Request.Path;
string strUrl = " /Account/LogOn?returnUrl={0} ";
context.HttpContext.Response.Redirect( string.Format(strUrl, HttpUtility.UrlEncode(path)), true);
}
}
如果考慮到緩存的情況,可以有兩種方法解決 注:第一種方法沒試成功,第二種成功了
1】】
cachePolicy.SetProxyMaxAge( new TimeSpan( 0));
cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
{
validationStatus = OnCacheAuthorization( new HttpContextWrapper(context));
}
最終調用 OnCacheAuthorization ,然后重寫 OnCacheAuthorization
{
return HttpValidationStatus.Invalid;
}
2】】
直接在 OnAuthorization 中設置
解決緩存問題。
