1. 程式人生 > >Lind.DDD.Authorization用戶授權介紹

Lind.DDD.Authorization用戶授權介紹

npr tar qdt sps mlp sshd 返回 drs bar

倉儲大叔好了相贈 網上2500元 跟誰學課堂 C#視頻 ddd領域驅動架構設計視頻 還贈送ABP視頻兩套

qq 2589406800 qq1399494644 qq2128543647 qq2890083872 qq3235634116 qq3381945576 qq2171713479
源代碼框架lind.ddd(後臺管理系統,電商系統,API,SSO,xamarin,ko,各組件單元測試) 贈送ABP視頻
+lindCore源碼+LindAgility(敏捷框架) (60元)

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用戶授權這塊就說到這裏,如果對大家有幫助,請您點個贊吧!

Lind.DDD.Authorization用戶授權介紹