程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> MVC 自定義過濾器/特性來實現登錄授權及驗證,mvc過濾器

MVC 自定義過濾器/特性來實現登錄授權及驗證,mvc過濾器

編輯:關於.NET

MVC 自定義過濾器/特性來實現登錄授權及驗證,mvc過濾器


   最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。

   十年河東十年河西,莫欺少年窮

   學無止境,精益求精

   最近在做自學MVC,遇到的問題很多,索性一點點總結下。

   寫過webForm項目的童鞋都知道,在執行Page_Load()之前,會執行:OnInit(EventArgs e),那麼在MVC中,在執行Action方法之前,會執行什麼呢?在執行MVC Action之後,又會執行什麼呢?下面給出答案:

   1、OnActionExecuting  在執行操作方法之前由 MVC 框架調用。

   2、OnActionExecuted  在執行操作方法後由 MVC 框架調用。

   3、OnResultExecuting  在執行操作結果之前由 MVC 框架調用。

   4、OnResultExecuted  在執行操作結果後由 MVC 框架調用。

   根據上述,我們可以看出,在執行Action方法之前,MVC會執行OnActionExecuting()方法,這個方法在控制器中並沒有展示給我們,需要我們進行重寫。

   下面以程序為例進行說明:

namespace WeiXinApi.Controllers
{
    //統一授權驗證
    [Authorize(Roles = "admins")]
    public class MangerController : Controller
    {
        public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
        {
            if (true)
            {
                //執行相關操作
               //................一般執行如下操作................
               //讀取用戶登錄信息,獲取用戶權限
                //MVC Form驗證是通過Cookies實現的,因此在此處讀取Cookies 並作驗證
            }
            else
            {
                //如果驗證失敗,則返回登陸頁
                filterContext.HttpContext.Response.Redirect("/Home/Login");
            }
        }

        public MangerController()
        {
            ViewBag.NewsCount = 43;
        }

        public ActionResult index()
        {
            return View();
        }
        public ActionResult wei_Configs()
        {
            return View();
        }
        

    }
}

   那麼,按照上述的思路,如果你有多個Controller需要驗證,那麼就必須在每個Controller中重寫這個方法,顯然這樣做是比較笨的方法,那麼我們動動我們聰明的小腦袋,很快會想出一個方法:那就是繼承。

   我們寫一個父親控制器,在這個父親控制器中,我們重寫這個方法,然後在需子控制器中繼承父親控制器即可,代碼如下:

   

   

   看到這兒,相信做過webForm的童鞋就會想起basePage.cs中的如下代碼:

   

   那麼,這樣定義一個父親控制器就算完美了嗎?如果有個控制器需要繼續另外一個類怎麼辦?

   由於其已經繼承了父親控制器,那麼子控制器就不能再繼承其他類,這樣顯然降低了程序的可擴展性,我們應當怎麼辦呢?

   還好,MVC為我們提供了過濾器,ActionFilterAttribute裡也有OnActionExecuting方法,跟Controller中的OnActionExecuting方法一樣, 同是抽象實現了IActionFilter接口。

   我們新建派生類如下:

namespace WeiXinApi.App_Start
{
    public class AuthenticationAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
        {
            string cookieName = FormsAuthentication.FormsCookieName;//讀取登錄授權Cookies的名稱
            HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies[cookieName];//接收這個Cookies
            FormsAuthenticationTicket authTicket = null;
            try
            {
                authTicket = FormsAuthentication.Decrypt(authCookie.Value);//我們知道MVC登錄授權的Cookies是加密的,所以我們在此需要解密
            }
            catch (Exception ex)
            {
                return;
            }
            if (authTicket != null && filterContext.HttpContext.User.Identity.IsAuthenticated)//如果Cookies不為Null 也通過驗證
            {
                string UserName = authTicket.Name;
                CommonMethod.setCookieForMIn("UserName", UserName, 30);//用於全局,加載用戶信息
                base.OnActionExecuting(filterContext);
            }
            else
            {
                filterContext.HttpContext.Response.Redirect("/Home/Login");//否則跳轉至登陸頁
            }
        }
    }
}

   至於MVC登錄授權的方法,大家可以參考我的博客:MVC 登錄認證與授權及讀取登錄錯誤碼

   在此,我們深究下ActionFilterAttribute 類的說明:

   

   在此:問大家一個問題,何為:Attribute ?

   中文名稱解釋為特性、屬性

   MVC的數據注解與驗證中會用到好多特性,譬如:

   

   那麼,我們應當怎麼使用新建的 AuthenticationAttribute 類呢?

   

   根據需求,大家可在類范圍內使用這個特性,亦可在Action方法頭上使用這個特性。

   以上便是MVC自定義過濾器特性來驗證授權登錄信息的方法

   祝大家有個好心情,謝謝

   @陳臥龍的博客

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved