asp.net mvc3 自定義 AuthorizeAttribute


   

    AuthorizeAttribute  

  AuthorizeAttribute 這個Filter實現了IAuthorization這個接口,是Asp.Net MVC提供的認證和授權功能的實現,要實現自己的認證和授權功能

   只需要繼承AuthorizeAttribute,然后覆蓋它的方法就可以了 .

   

public  class MyAuthAttribute : AuthorizeAttribute
{
   ...
   ...
}

  

   首先重寫 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);
                 // 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
protected  override  void HandleUnauthorizedRequest(AuthorizationContext context)
        {
             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】】

       

        OnAuthorization 中注釋的部分
 

      

                HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
                cachePolicy.SetProxyMaxAge( new TimeSpan( 0));
                cachePolicy.AddValidationCallback(CacheValidateHandler,  null  /*  data  */);

    

           

        回調函數 CacheValidateHandler
       

        

        private  void CacheValidateHandler(HttpContext context,  object data,  ref HttpValidationStatus validationStatus)
        {
            validationStatus = OnCacheAuthorization( new HttpContextWrapper(context));
        }

  

      最終調用  OnCacheAuthorization  ,然后重寫  OnCacheAuthorization

 

             

        protected  override HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext)
        {
             return HttpValidationStatus.Invalid;
        }

 

      2】】

  

            直接在 OnAuthorization 中設置

 

           filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);

 

           解決緩存問題。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM