• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    ASP.NET.4.5.1+MVC5.0设置系统角色与权限(一)

    数据结构

    权限分配

    1.在项目中新建文件夹Helpers

    2.在HR.Helpers文件夹下添加EnumMoudle.Cs

    复制代码 代码如下:

    namespace HR.Helpers
    {
        public enum EnumMoudle
        {
            /// summary>
            /// 模块
            /// /summary>
            [EnumTitle("用户管理")]
            SysUserManage_Role = 102,
            [EnumTitle("机构管理")]
            Department = 201,
            [EnumTitle("人事资料")]
            Employees = 301,
            [EnumTitle("系统管理")]
            BaseInfo = 404,
        }
    }

    3.在HR.Helpers文件夹下添加ControllerBase.Cs

    复制代码 代码如下:

    namespace HR.Helpers
    {
        public class ControllerBase : Controller
        {
            /// summary>
            /// 操作人,传IP....到后端记录
            /// /summary>
            public virtual Operater Operater
            {
                get
                {
                    return null;
                }
            }
            /// summary>
            /// 分页大小
            /// /summary>
            public virtual int PageSize
            {
                get
                {
                    return 15;
                }
            }
            protected ContentResult JsonP(string callback, object data)
            {
                var json = Newtonsoft.Json.JsonConvert.SerializeObject(data);
                return this.Content(string.Format("{0}({1})", callback, json));
            }
            /// summary>
            /// 当弹出DIV弹窗时,需要刷新浏览器整个页面
            /// /summary>
            /// returns>/returns>
            public ContentResult RefreshParent(string alert = null)
            {
                var script = string.Format("script>{0}; parent.location.reload(1)/script>", string.IsNullOrEmpty(alert) ? string.Empty : "alert('" + alert + "')");
                return this.Content(script);
            }
            public new ContentResult RefreshParentTab(string alert = null)
            {
                var script = string.Format("script>{0}; if (window.opener != null) {{ window.opener.location.reload(); window.opener = null;window.open('', '_self', '');  window.close()}} else {{parent.location.reload(1)}}/script>", string.IsNullOrEmpty(alert) ? string.Empty : "alert('" + alert + "')");
                return this.Content(script);
            }
            /// summary>
            /// 用JS关闭弹窗
            /// /summary>
            /// returns>/returns>
            public ContentResult CloseThickbox()
            {
                return this.Content("script>top.tb_remove()/script>");
            }
            /// summary>
            ///  警告并且历史返回
            /// /summary>
            /// param name="notice">/param>
            /// returns>/returns>
            public ContentResult Back(string notice)
            {
                var content = new StringBuilder("script>");
                if (!string.IsNullOrEmpty(notice))
                    content.AppendFormat("alert('{0}');", notice);
                content.Append("history.go(-1)/script>");
                return this.Content(content.ToString());
            }
            public ContentResult PageReturn(string msg, string url = null)
            {
                var content = new StringBuilder("script type='text/javascript'>");
                if (!string.IsNullOrEmpty(msg))
                    content.AppendFormat("alert('{0}');", msg);
                if (string.IsNullOrWhiteSpace(url))
                    url = Request.Url.ToString();
                content.Append("window.location.href='" + url + "'/script>");
                return this.Content(content.ToString());
            }
            /// summary>
            /// 转向到一个提示页面,然后自动返回指定的页面
            /// /summary>
            /// param name="notice">/param>
            /// param name="redirect">/param>
            /// returns>/returns>
            public ContentResult Stop(string notice, string redirect, bool isAlert = false)
            {
                var content = "meta http-equiv='refresh' content='1;url=" + redirect + "' />body style='margin-top:0px;color:red;font-size:24px;'>" + notice + "/body>";
                if (isAlert)
                    content = string.Format("script>alert('{0}'); window.location.href='{1}'/script>", notice, redirect);
                return this.Content(content);
            }
            /// summary>
            /// 在方法执行前更新操作人
            /// /summary>
            /// param name="filterContext">/param>
            public virtual void UpdateOperater(ActionExecutingContext filterContext)
            {
                if (this.Operater == null)
                    return;
                WCFContext.Current.Operater = this.Operater;
            }
            public virtual void ClearOperater()
            {
                //TODO
            }
            /// summary>
            /// AOP拦截,在Action执行后
            /// /summary>
            /// param name="filterContext">filter context/param>
            protected override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                base.OnActionExecuted(filterContext);
                if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest() !filterContext.IsChildAction)
                    RenderViewData();
                this.ClearOperater();
            }
            protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                this.UpdateOperater(filterContext);
                base.OnActionExecuting(filterContext);
                //在方法执行前,附加上PageSize值
                filterContext.ActionParameters.Values.Where(v => v is Request).ToList().ForEach(v => ((Request)v).PageSize = this.PageSize);
            }
            /// summary>
            /// 产生一些视图数据
            /// /summary>
            protected virtual void RenderViewData()
            {
            }
            /// summary>
            /// 当前Http上下文信息,用于写Log或其他作用
            /// /summary>
            public WebExceptionContext WebExceptionContext
            {
                get
                {
                    var exceptionContext = new WebExceptionContext
                    {
                        IP = Fetch.UserIp,
                        CurrentUrl = Fetch.CurrentUrl,
                        RefUrl = (Request == null || Request.UrlReferrer == null) ? string.Empty : Request.UrlReferrer.AbsoluteUri,
                        IsAjaxRequest = (Request == null) ? false : Request.IsAjaxRequest(),
                        FormData = (Request == null) ? null : Request.Form,
                        QueryData = (Request == null) ? null : Request.QueryString,
                        RouteData = (Request == null || Request.RequestContext == null || Request.RequestContext.RouteData == null) ? null : Request.RequestContext.RouteData.Values
                    };
                    return exceptionContext;
                }
            }
            /// summary>
            /// 发生异常写Log
            /// /summary>
            /// param name="filterContext">/param>
            protected override void OnException(ExceptionContext filterContext)
            {
                base.OnException(filterContext);
                var e = filterContext.Exception;
                LogException(e, this.WebExceptionContext);
            }
            protected virtual void LogException(Exception exception, WebExceptionContext exceptionContext = null)
            {
                //do nothing!
            }
        }
        public class WebExceptionContext
        {
            public string IP { get; set; }
            public string CurrentUrl { get; set; }
            public string RefUrl { get; set; }
            public bool IsAjaxRequest { get; set; }
            public NameValueCollection FormData { get; set; }
            public NameValueCollection QueryData { get; set; }
            public RouteValueDictionary RouteData { get; set; }
        }
    }

    4.在项目文件夹中新建ControllerBase.cs

    复制代码 代码如下:

    namespace HR
    {
        public abstract class ControllerBase:HR.Helpers.ControllerBase
        {
            protected override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                base.OnActionExecuted(filterContext);
            }

            protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                base.OnActionExecuting(filterContext);
            }
        }
    }

    5.在项目中新建RoleControllerBase.cs

    复制代码 代码如下:

    namespace HR
    {
        public class RoleControllerBase : ControllerBase
        {
            SystemUserRepository sysuserrepository = new SystemUserRepository();
            /// summary>
            /// 用户权限
            /// /summary>
            public virtual ListEnumMoudle> PermissionList
            {
                get
                {
                    var permissionList = new ListEnumMoudle>();
                    return permissionList;
                }
            }
            public string BusinessPermissionString { get; set; }
            [NotMapped]
            public ListEnumMoudle> BusinessPermissionList
            {
                get
                {
                    if (string.IsNullOrEmpty(BusinessPermissionString))
                        return new ListEnumMoudle>();
                    else
                        return BusinessPermissionString.Split(",".ToCharArray()).Select(p => int.Parse(p)).CastEnumMoudle>().ToList();
                }
                set
                {
                    BusinessPermissionString = string.Join(",", value.Select(p => (int)p));
                }
            }
            /// summary>
            /// Action方法执行前没有权限提示信息
            /// /summary>
            /// param name="filterContext">/param>
            protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                var noAuthorizeAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AuthorizeIgnoreAttribute), false);
                if (noAuthorizeAttributes.Length > 0)
                    return;
                base.OnActionExecuting(filterContext);
                bool hasPermission = true;
                var permissionAttributes = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(PermissionAttribute), false).CastPermissionAttribute>();
                permissionAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(PermissionAttribute), false).CastPermissionAttribute>().Union(permissionAttributes);
                var attributes = permissionAttributes as IListPermissionAttribute> ?? permissionAttributes.ToList();
                if (permissionAttributes != null attributes.Count() > 0)
                {
                     string cookie = CookieHelper.GetValue("SystemUserID");
                     if (string.IsNullOrEmpty(cookie))
                     {
                         filterContext.Result = Content("您没有登录!");
                     }
                     else
                     {
                         int mid = int.Parse(CookieHelper.GetValue("SystemUserID"));
                         var model = sysuserrepository.GetModel(mid);
                         BusinessPermissionString = model.BusinessPermissionString;
                         hasPermission = true;
                         foreach (var attr in attributes)
                         {
                             foreach (var permission in attr.Permissions)
                             {
                                 if (!BusinessPermissionList.Contains(permission))
                                 {
                                     hasPermission = false;
                                     break;
                                 }
                             }
                         }
                         if (!hasPermission)
                         {
                             if (Request.UrlReferrer != null)
                                 filterContext.Result = this.Stop("您没有权限!", "/default/ng");
                             else
                                 filterContext.Result = Content("您没有权限!");
                         }
                     }
                }
            }
        }
    }

    6.在每个Controller继承RoleControllerBase类

    public class EmployeesController : RoleControllerBase

    7.在HR.Helpers文件夹下添加PermissionAttribute.Cs ,并继承 FilterAttribute, IActionFilter

    复制代码 代码如下:

    namespace HR.Helpers
    {
        public class PermissionAttribute : FilterAttribute, IActionFilter
        {
            public ListEnumMoudle> Permissions { get; set; }

            public PermissionAttribute(params EnumMoudle[] parameters)
            {
                Permissions = parameters.ToList();
            }

            public void OnActionExecuted(ActionExecutedContext filterContext)
            {
                //throw new NotImplementedException();
            }

            public void OnActionExecuting(ActionExecutingContext filterContext)
            {
                //throw new NotImplementedException();
            }
        }
    }

    8.然后在Controller或者Action方法加上验证

    复制代码 代码如下:

     [Permission(EnumMoudle.Employees),Authorize, ValidateInput(false)]
     [Permission(EnumMoudle.SysUserManage_Role)]

    9.在用户管理Controller中添加权限分配,修改方法

    复制代码 代码如下:

            #region 添加管理员
            /// summary>
            /// 添加页
            /// /summary>
            /// param name="model">管理员实体类/param>
            /// returns>/returns>
            [Authorize]
            public ActionResult Add()
            {
                var moudleList = EnumHelper.GetItemValueListEnumMoudle>();
                this.ViewBag.MoudleList = new SelectList(mouldeList, "Key", "Value");
                return View();
            }
            /// summary>
            /// 添加事件
            /// /summary>
            /// param name="model">实体类/param>
            /// param name="fc">/param>
            /// returns>/returns>
            [Authorize, HttpPost, ValidateInput(false)]
            public ActionResult Add(SystemUser model, FormCollection fc)
            {
                model.BusinessPermissionString = fc["MoudelList"];
                model.State = 1;
                model.CreateTime = DateTime.Now;
                systemuserrepository.SaveOrEditModel(model);
                return RedirectToAction("UserList");
            }
            #endregion
            //修改权限
            [Authorize, AcceptVerbs(HttpVerbs.Post), ValidateInput(false)]
            public ActionResult Edit(int id, FormCollection fc)
            {
                var model = systemuserrepository.GetModel(id);
                if (model != null)
                {
                    string password = model.PassWord;
                    if (Request.Form["PassWord"] != "")
                    {
                        model.BusinessPermissionString = fc["MoudleList"];
                        UpdateModel(model);
                        systemuserrepository.SaveOrEditModel(model);
                    }
                    else
                    {
                        model.BusinessPermissionString = fc["MoudleList"];
                        UpdateModel(model);
                        model.PassWord = password;
                        systemuserrepository.SaveOrEditModel(model);
                    }
                    return RedirectToAction("userlist");
                }
                else
                    return View("404");
            }
            #endregion

    复制代码 代码如下:

            [Authorize]
            public ActionResult Edit(int id)
            {
                var model = systemuserrepository.GetModel(id);
                if (model != null)
                {
                    var moudleList = EnumHelper.GetItemValueListEnumBusinessPermission>();
                    this.ViewBag.MoudleList = new SelectList(moudleList, "Key", "Value", string.Join(",", model.BusinessPermissionString.ToString()));
                    return View(model);
                }
                else
                    return View("404");
            }

    以上就是本文的全部内容了,后续我们将持续更新,小伙伴们是否喜欢本系列文章呢?

    您可能感兴趣的文章:
    • .NET Web开发之.NET MVC框架介绍
    • asp.net mvc下拉框Html.DropDownList 和DropDownListFor的常用方法
    • 使用asp.net MVC4中的Bundle遇到的问题及解决办法分享
    • asp.net MVC实现无组件上传图片实例介绍
    • Asp.net实现MVC处理文件的上传下载功能实例教程
    • asp.net如何进行mvc异步查询
    上一篇:ASP.NET动态添加用户控件的方法
    下一篇:ASP.NET.4.5.1+MVC5.0设置系统角色与权限(二)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    ASP.NET.4.5.1+MVC5.0设置系统角色与权限(一) ASP.NET.4.5.1+MVC5.0,设置,系统,