码迷,mamicode.com
首页 > Web开发 > 详细

ASP.NET.4.5.1+MVC5.0系统角色和权限讲解

时间:2015-04-02 16:42:36      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:新建文件夹   软件设计   public   控制器   角色   

细说ASP.NET.4.5.1+MVC5.0系统角色和权限

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

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


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




namespace HR.Helpers

{

    public enum EnumMoudle

    {

        /// <summary>

        /// 模块 # codego.net#

        /// </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 List<EnumMoudle> PermissionList

        {

            get

            {

                var permissionList = new List<EnumMoudle>();

                return permissionList;

            }

        }

        public string BusinessPermissionString { get; set; }

        [NotMapped]

        public List<EnumMoudle> BusinessPermissionList 

        {

            get

            {

                if (string.IsNullOrEmpty(BusinessPermissionString))

                    return new List<EnumMoudle>();

                else

                    return BusinessPermissionString.Split(",".ToCharArray()).Select(p => int.Parse(p)).Cast<EnumMoudle>().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).Cast<PermissionAttribute>();

            permissionAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(PermissionAttribute), false).Cast<PermissionAttribute>().Union(permissionAttributes);

            var attributes = permissionAttributes as IList<PermissionAttribute> ?? 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 List<EnumMoudle> 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.GetItemValueList<EnumMoudle>();

            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.GetItemValueList<EnumBusinessPermission>();

                this.ViewBag.MoudleList = new SelectList(moudleList, "Key", "Value", string.Join(",", model.BusinessPermissionString.ToString()));

                return View(model);

            }

            else

                return View("404");

        }



本文出自 “kanlu1515” 博客,请务必保留此出处http://10077983.blog.51cto.com/10067983/1627643

ASP.NET.4.5.1+MVC5.0系统角色和权限讲解

标签:新建文件夹   软件设计   public   控制器   角色   

原文地址:http://10077983.blog.51cto.com/10067983/1627643

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!