引言
新公司當初面試的時候問了我很多用戶驗證的問題,這里就把我的對於驗證的想法寫一下,希望可以有一個系統的學習記錄。
一、如何驗證
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 的控制器和操作
總結
由於本人也是才疏學淺,改文章也是為了記錄學習。如果文中有不足或者錯誤之處還請大家指出。謝謝