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

来源:http://www.cnblogs.com/chenwolong/archive/2016/11/18/Attribute.html
-Advertisement-
Play Games

最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。 十年河東十年河西,莫欺少年窮 學無止境,精益求精 最近在做自學MVC,遇到的問題很多,索性一點點總結下。 寫過webForm項目的童鞋都知道,在執行Page_Load()之前,會執行:OnInit(Even ...


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

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

   學無止境,精益求精

   最近在做自學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自定義過濾器特性來驗證授權登錄信息的方法

   祝大家有個好心情,謝謝

   @陳卧龍的博客


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • TensorFlow 這個不用多介紹了吧,大家都知道,Google的開源深度學習軟體庫,官網點這裡:https://www.tensorflow.org/ 當然這個工具官方支持裝在 Ubuntu 和 Mac OS X 上,想要在 Windows 下使用,就需要藉助 Docker 了,看了幾篇相關的 ...
  • HTTP API也有兩種操作:寫入和查詢,本文就先給大家介紹一下 InfluxDB的HTTP API的寫入操作方式。 在InfluxDB學習的上一篇文章:InfluxDB學習之InfluxDB的基本操作 中,我們提到 InfluxDB操作有三種方式,其中一種是HTTP API的方式。 HTTP AP ...
  • 1、get方式 發送頁 <form id="form1" runat="server"> <div> <a href="WebForm2.aspx?name=5">調轉到Form2</a> <asp:Button ID="button2" Text="跳轉頁面" runat="server" onc ...
  • 前面一片文章已經提高我們公司的異構(相容dubbo)SOA系統架構,解決了不少技術痛點,也還算比較完善,也順利推廣開來。 但是作為項目的開發者,自己產品的問題心裡是清楚的,離自己滿意還是有不小的距離。 在推廣的同時,我緊張的進入了下一個版本的開發,讓它更加完善。 原來的版本號是1.0,現在版本升級為 ...
  • ...
  • 抓緊時間,繼續寫教程,因為發現用戶期待的內容,都在業務處理那一塊。不得不繼續勤勞了。這節主要介紹工具欄區的玩法,詳情如下:... ...
  • 1.定義一個ToolTipController變數 private ToolTipController _mToolTipController = null; 2.封裝在一個方法中 protected void ToolTipController(GridControl gcData) { if ( ...
  • 很久沒有寫文章啦,今天分享一個如何在ASP.NET MVC里使用Ajax下載生成文件的方法,以下只是個人心得: 大家都應該知道,在ASP.NET MVC里,如果通過Ajax調用後臺控制器時,可以返回一個JSON對象,但並不能直接返迴文件(除非刷新頁面,那就不是Ajax啦),所以如果想用Ajax生成文 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...