• ASP.NET MVC4 权限验证


    在ASP.NET MVC4 中继承ActionFilterAttribute 类,重写OnActionExecuting方法

    /// <summary>
        /// 权限拦截
        /// </summary>
        [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
        public class PermissionFilterAttribute : ActionFilterAttribute
        {
            /// <summary>
            /// 权限拦截
            /// </summary>
            /// <param name="filterContext"></param>
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                //权限拦截是否忽略
                bool IsIgnored = false;
                if (filterContext == null)
                {
                    throw new ArgumentNullException("filterContext");
                }
                var path = filterContext.HttpContext.Request.Path.ToLower();
                //获取当前配置保存起来的允许页面
                IList<string> allowPages = ConfigSettings.GetAllAllowPage();
                foreach (string page in allowPages)
                {
                    if (page.ToLower() == path)
                    {
                        IsIgnored = true;
                        break;
                    }
                }
                if (IsIgnored)
                    return;
                //接下来进行权限拦截与验证
                object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(ViewPageAttribute), true);
                var isViewPage = attrs.Length == 1;//当前Action请求是否为具体的功能页
    
                if (this.AuthorizeCore(filterContext) == false)//根据验证判断进行处理
                {
                    //注:如果未登录直接在URL输入功能权限地址提示不是很友好;如果登录后输入未维护的功能权限地址,那么也可以访问,这个可能会有安全问题
                    if (isViewPage == true)
                    {
                        //跳转到登录页面
                        filterContext.RequestContext.HttpContext.Response.Redirect("~/Admin/Manage/UserLogin");
                    }
                    else
                    {
                        object[] attrsUIException = filterContext.ActionDescriptor.GetCustomAttributes(typeof(LigerUIExceptionResultAttribute), true);
                        if (attrsUIException.Length == 1)
                        {
                            filterContext.Result = new FormatJsonResult() { IsError=true, Data=null,Message="您没有权限执行此操作!" };//功能权限弹出提示框
                        }
                        else
                            
                            filterContext.RequestContext.HttpContext.Response.Redirect("~/Admin/Manage/Error");
                    }
                }
            }
            /// <summary>
            /// [Anonymous标记]验证是否匿名访问
            /// </summary>
            /// <param name="filterContext"></param>
            /// <returns></returns>
            public bool CheckAnonymous(ActionExecutingContext filterContext)
            {
                //验证是否是匿名访问的Action
                object[] attrsAnonymous = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AnonymousAttribute), true);
                //是否是Anonymous
                var Anonymous = attrsAnonymous.Length == 1;
                return Anonymous;
            }
            /// <summary>
            /// [LoginAllowView标记]验证是否登录就可以访问(如果已经登陆,那么不对于标识了LoginAllowView的方法就不需要验证了)
            /// </summary>
            /// <param name="filterContext"></param>
            /// <returns></returns>
            public bool CheckLoginAllowView(ActionExecutingContext filterContext)
            {
                //在这里允许一种情况,如果已经登陆,那么不对于标识了LoginAllowView的方法就不需要验证了
                object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(LoginAllowViewAttribute), true);
                //是否是LoginAllowView
                var ViewMethod = attrs.Length == 1;
                return ViewMethod;
            }
    
            /// <summary>
            /// //权限判断业务逻辑
            /// </summary>
            /// <param name="filterContext"></param>
            /// <param name="isViewPage">是否是页面</param>
            /// <returns></returns>
            protected virtual bool AuthorizeCore(ActionExecutingContext filterContext)
            {
    
                if (filterContext.HttpContext == null)
                {
                    throw new ArgumentNullException("httpContext");
                }
                //验证当前Action是否是匿名访问Action
                if (CheckAnonymous(filterContext))
                    return true;
                //未登录验证
                if (SessionHelper.Get("UserID") == null)
                {
                    return false;
                }
                //验证当前Action是否是登录就可以访问的Action
                if (CheckLoginAllowView(filterContext))
                    return true;
    
                //下面开始用户权限验证
                var user = new UserService();
                SysCurrentUser CurrentUser = new SysCurrentUser();
                var controllerName = filterContext.RouteData.Values["controller"].ToString();
                var actionName = filterContext.RouteData.Values["action"].ToString();
                //如果是超级管理员,直接允许
                if (CurrentUser.UserID == ConfigSettings.GetAdminUserID())
                {
                    return true;
                }
                //如果拥有超级管理员的角色就默认全部允许
                string AdminUserRoleID = ConfigSettings.GetAdminUserRoleID().ToString();
                //检查当前角色组有没有超级角色
                if (Tools.CheckStringHasValue(CurrentUser.UserRoles, ',', AdminUserRoleID))
                {
                    return true;
                }
    
                //Action权限验证
                if (controllerName.ToLower() != "manage")//如果当前Action请求为具体的功能页并且不是Manage中 Index页和Welcome页
                {
                    //验证
                    if (!user.RoleHasOperatePermission(CurrentUser.UserRoles, controllerName, actionName))//如果验证该操作是否拥有权限
                    {
                        return false;
                    }
                }
                //管理页面直接允许
                return true;
            }
        }
    }
  • 相关阅读:
    文件查找和比较命令 来自: http://man.linuxde.net/find
    Docker学习计划
    Mybatis各种模糊查询
    linux下vi命令大全
    mac下的环境变量
    slf4j输出变量
    使用lombok中的log
    idea中的java web项目(添加jar包介绍)和java maven web项目目录结构
    slf4j+logback&logback.xml
    日志框架
  • 原文地址:https://www.cnblogs.com/mikechang/p/3272982.html
Copyright © 2020-2023  润新知