Lind.DDD.Authorization用戶授權介紹

来源:http://www.cnblogs.com/lori/archive/2016/01/06/5107747.html
-Advertisement-
Play Games

回到目錄Lind.DDD.Authorization是Lind.DDD框架的組成部分,之所以把它封裝到框架里,原因就是它的通用性,幾乎在任何一個系統中,都少不了用戶授權功能,用戶授權對於任何一個系統來說都是必要的,像管理型的頁面都需要用戶先去登陸,然後拿到憑證,才可以進行訪問,這在MVC和WebAp...


回到目錄

Lind.DDD.Authorization是Lind.DDD框架的組成部分,之所以把它封裝到框架里,原因就是它的通用性,幾乎在任何一個系統中,都少不了用戶授權功能,用戶授權對於任何一個系統來說都是必要的,像管理型的頁面都需要用戶先去登陸,然後拿到憑證,才可以進行訪問,這在MVC和WebApi體繫結構里是很容易實現的,像過濾器里的AuthorizeAttribute和ActionFilterAttribute都可以實現用戶授權的功能。

AuthorizeAttribute和ActionFilterAttribute

AuthorizeAttribute這個過濾器從字面上就可以看出它的功能,它主要用在用戶角色授權上,對於我們的系統來說,那就是哪些頁面需要登陸,就把哪個Action添加這個特性,它有方法OnAuthorization,表示當頁面載入之前,去判斷用戶是否有訪問本action的許可權,我們可以根據自己的需要去override它;ActionFilterAttribute過濾器是我們平時用的最多的,即在action執行前,後,View渲染前,渲染後的跟蹤,我們在使用時,重寫對應的方法,即可以實現對各個步驟的跟蹤。

實現原理,方法攔截

在mvc里,過濾器的含義就是方法攔截,這個概念和Aop不某而合,都是對方法進行攔截,然後進行二次加工,過濾器的原理也一樣,在進行攔截後,可以去填充你自己的業務邏輯,然後選擇繼續渲染還是離開頁面。

AuthorizationLoginFilter過濾器的實現

下麵是我自己整理的,用戶授權的一個過濾器,分享一下

    /// <summary>
    /// 授權過濾器
    /// Function:MVC模式下使用
    /// Author:Lind.zhang
    /// </summary>
    public class AuthorizationLoginFilter : AuthorizeAttribute
    {

        /// <summary>
        /// 驗證失敗後所指向的控制器和action
        /// 可以在使用特性時為它進行賦值
        /// </summary>
        public AuthorizationLoginFilter(string failControllerName = "Home", string failActionName = "Login")
        {
            _failControllerName = failControllerName;
            _failActionName = failActionName;
        }
        public string _failControllerName, _failActionName;
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            //被添加AllowAnonymousAttribute特性的過濾器將不參加AuthorizationLoginFilter的驗證
            bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) ||
                filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true);

            //為登陸頁添加例外,其它頁都自動在global.asax里添加到全局過濾器中,MVC3及以後版本支持它
            if (!skipAuthorization)
            {
                if (!CurrentUser.IsLogin)
                {
                    filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary { 
                     { "Action",_failActionName },
                     { "Controller", _failControllerName}, 
                     { "returnUrl", HttpContext.Current.Request.Url.ToString() } });
                }
            }
        }
    }

授權模塊的CurrentUser的實現

對於過濾器把沒有登陸的用戶指引登陸頁後,用戶將進行登陸操作,然後Lind.DDD要做什麼?需要將用戶標示,角色信息,許可權信息進行存儲,這時就是我們CurrentUser登場的時候了,設計很簡單,一個方法用來持久化用戶授權的對象,幾個屬性用來返回需要返回的內容,呵呵 !

    /// <summary>
    /// 當前登陸的用戶信息
    /// 可以有Redis Session和Session進行實現
    /// </summary>
    public class CurrentUser
    {
        #region Public Properties
        /// <summary>
        /// 當然登陸的用戶ID
        /// </summary>
        public static string UserID
        {
            get
            {
                return (System.Web.HttpContext.Current.Session["UserID"] ?? string.Empty).ToString();
            }
        }
        /// <summary>
        /// 當前登陸的用戶名
        /// </summary>
        public static string UserName
        {
            get
            {
                return (System.Web.HttpContext.Current.Session["UserName"] ?? string.Empty).ToString();
            }
        }
        /// <summary>
        /// 用戶角色
        /// </summary>
        public static string Role
        {
            get
            {
                return (System.Web.HttpContext.Current.Session["Role"] ?? string.Empty).ToString();
            }
        }
        /// <summary>
        /// 用戶許可權
        /// 增,刪,改,查
        /// </summary>
        public static string Authority
        {
            get
            {
                return (System.Web.HttpContext.Current.Session["Authority"] ?? string.Empty).ToString();
            }
        }
        /// <summary>
        /// 當前登陸用戶存儲的擴展信息
        /// </summary>
        public static string ExtInfo
        {
            get
            {
                return (System.Web.HttpContext.Current.Session["ExtInfo"] ?? string.Empty).ToString();
            }
        }
        /// <summary>
        /// 是否登陸
        /// </summary>
        public static bool IsLogin
        {
            get
            {
                return !string.IsNullOrWhiteSpace(UserID);
            }
        }
        #endregion

        #region Public Methods
        /// <summary>
        /// 退出登陸
        /// </summary>
        public static void Exit()
        {
            System.Web.HttpContext.Current.Session.Abandon();//清除全部Session
        }
        /// <summary>
        /// 將用戶信息持久化到Session
        /// </summary>
        /// <param name="userID"></param>
        /// <param name="userName"></param>
        /// <param name="ExtInfo"></param>
        public static void Serialize(
            string userID,
            string userName,
            string extInfo = "",
            string role = "",
            string authority = "")
        {
            System.Web.HttpContext.Current.Session["UserID"] = userID;
            System.Web.HttpContext.Current.Session["UserName"] = userName;
            System.Web.HttpContext.Current.Session["ExtInfo"] = ExtInfo;
            System.Web.HttpContext.Current.Session["Role"] = role;
            System.Web.HttpContext.Current.Session["Authority"] = authority;

        }
        #endregion

    }

OK,對於Lind.DDD.Authorization用戶授權這塊就說到這裡,如果對

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

-Advertisement-
Play Games
更多相關文章
  • [1]引用 [2]特性 [3]屬性 [4]方法
  • Senna.js 是一個速度超快的單頁應用程式引擎,提供了幾個低級別的API,可以幫助你打造現代化的基於 Web 的應用程式。更重要的是,搜索引擎蜘蛛應該能夠索引相同的內容。通過使用 HTML5 History API,我們可以操縱使用 pushState,replaceState 和 popSta...
  • 純靜態頁面,不依賴伺服器端腳本,從一個靜態頁面傳遞給另一個靜態頁面,大致有這三種實現方案:1.通過url ?後面的參數傳 www.xxx.com/xxx.html?key=value&&key2=value2通過js,locaton.search獲取2.通過cookiejs設置cookie,另一個頁...
  • 樣式表有三種方式:內嵌樣式(inline Style) :是寫在Tag裡面的,內嵌樣式只對所有的Tag有效。 (也稱作“內聯樣式”)內部樣式(internal Style Sheet):是寫在HTML的裡面的,內部樣式只對所在的網頁有效。外部樣式表(External Style Sheet):如果很...
  • [1]屬性 [2]方法 [3]tips
  • 不造你有沒有這樣把js數據類型分類,不造你是否知道各種數據類型是怎樣賦值怎樣傳遞的,所有的不造,看了這篇就能懂了,保證小學生即可懂!
  • 基於jQuery滑鼠點擊水波動畫豎直導航代碼。這是一款基於jQuery+CSS3實現的帶動畫效果的豎直導航欄特效。效果圖如下:線上預覽源碼下載實現的代碼。html代碼: 網站首頁 關於我們 產品中心 成功案例 ...
  • DOM是前端編程中一個非常重要的部分,我們在動態修改頁面的樣式、內容、添加頁面動畫以及為頁面元素綁定事件時,本質都是在操作DOM。DOM並不是JS語言的一個部分,我們通過JAVA、PHP等語言抓取網頁內容時需要對網頁進行解析並拿到我們感興趣的那部分內容,這時其實也是在操作DOM。當然在前端領域,我們...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...