關於.net中的身份認證(AuthorizeAttribute)的問題


 

  引言

    新公司當初面試的時候問了我很多用戶驗證的問題,這里就把我的對於驗證的想法寫一下,希望可以有一個系統的學習記錄。

  一、如何驗證

    B/S結構的請求是http請求,個人理解的http請求有兩個特點:1、無狀態 2、短連接  (下篇文章會說一下我個人對於http連接的想法)。所以一個請求是否是我們系統的用戶我們一般是用Session和Cookie來判斷的。請求又可以分為兩種,一種是頁面的請求,一種是數據API的ajax請求。所以一個判斷請求是否是系統用戶可以這么寫

    

 public void HasLogin(HttpContextBase httpContext)
        {
            //判斷用戶登錄信息是否存在,這里是用Session,有的用Cookie(加密)
            if (httpContext.Session["UserInfo"] == null)
            {   
                //如果是AJAX的API請求
                if (httpContext.Request.IsAjaxRequest())
                {
                    //這邊處理錯誤API請求反饋,一般是反饋錯誤提示
                }
                else
                {
                    //這邊是頁面請求,如果是未登錄的話直接跳轉到登錄頁面
                }
            }   
        }

  二、如何使用

    有了驗證的邏輯之后就可以通過重寫.net自己的AuthorizeAttribute類來實現用戶身份驗證了。AuthorizeAttribute類有兩個重要的方法:AuthorizeCore和HandleUnauthorizedRequest。其中AuthorizeCore函數是用來判斷一個請求是否通過用戶驗證,它的返回結果是一個bool。HandleUnauthorizedRequest函數則是在AuthorizeCore返回結果是false時會調用的函數。源代碼如下所示

    從圖中可以看出當AuthorizeCore函數結果為false時,就會觸發HandleUnauthorizedRequest函數來處理驗證失敗。所以我們可以自定義一個AuthorizeAttribute類的子類並重寫上面的兩個方法。

    

protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext.Session["UserInfo"] == null)
            {
                return false;
            }
            return true;
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            //如果是Ajax請求
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.Result = new JsonResult
                {
                    Data = new
                    {
                        ResultCode = ResultCode.Exception,
                        ResultMess = "請求用戶未登錄!"
                    }
                };
            }
            else
            {
                //處理Url請求
                //驗證不通過,直接跳轉到相應頁面,注意:如果不使用以下跳轉,則會繼續執行Action方法 
                filterContext.Result = new RedirectResult("/Home/Index");
            }
        }

  三、添加AuthorizeAttribute過濾

     我們自定義個AthorizeAttribute已經實現了,接下來就是在控制器上面實現了。具體實現方法有三種

    1、Controller層級添加

    

 

     2、Action層級添加

    

    3、全局添加

    

 

    (這個過濾器配置可以在Global.asax中看到)

  四、取消過濾

      有些頁面,例如登錄頁面、登錄請求的時候用戶是肯定還沒有登錄的,這個時候如果我用了全局添加的話,用戶豈不是永遠無法登錄了?那么為了使某些特定的方法可以不用驗證過濾可以在特定Action、Controller上面添加以下抬頭

        

AllowAonymous表示一個特性,該特性用於標記在授權期間要跳過 System.Web.Mvc.AuthorizeAttribute 的控制器和操作

   

  總結

    由於本人也是才疏學淺,改文章也是為了記錄學習。如果文中有不足或者錯誤之處還請大家指出。謝謝

 


免責聲明!

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



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