ASP.NET MVC权限控制思路

在系统开发的时候一个老生常谈的权限管理问题,翻阅了很多的网络资料,但是总感觉离实际使用还有一段距离,其实权限控制无非就几个“请求、页面按钮、字段显示”, 对于前端权限就需要配合JS了, 这里主要展示我这些年来一直使用的一个关于权限管理的案例,如果你只是写一个简单的CMS系统,那么下面代码其实拷贝就可以用了,如果是需要进行较大型系统开发就需要进一步封装, 下面是我的思路,写的不好大家勿喷哈,有不同意见的留下一起探讨。

1、在MVC开发时路由中包含了我们所有请求信息(Controller、Action、URL全文),而MVC又提供了过滤器的机制,因此我们将权限管理封装到过滤其中。首先把每个Controller的继承封装一个BaseController,这个Controller基类可以编写一些直接调用的方法,例如Session等。

    /// <summary>
    /// 系统基础控制器类
    /// </summary>
    public abstract class BaseUIController : Controller
    {
        /// <summary>
        /// 页面初始化过程
        /// </summary>
        protected override void Initialize(System.Web.Routing.RequestContext requestContext)
        {
            requestContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            base.Initialize(requestContext);
        }

        /// <summary>
        /// 内容返回
        /// </summary>
        /// <param name="content">特定内容供JS参考是否含流程定义等动作。</param>
        /// <param name="contentType"></param>
        /// <param name="contentEncoding"></param>
        /// <returns></returns>
        protected override ContentResult Content(string content, string contentType, Encoding contentEncoding)
        {
            return base.Content(content, contentType, contentEncoding);
        }

        /// <summary>
        /// 登陆用户ID (Session存储)
        /// </summary>
        public long LoginedUserID
        {
            get
            {
                object UID = Ant.UI.Controls.SessionConfig.GetSession("UID");
                if (Session == null || UID == null)
                    return -1;
                else
                {
                    return (long)UID;
                }
            }
            set
            {
                Ant.UI.Controls.SessionConfig.SetSession("UID", value);
            }
        }

        /// <summary>
        /// 获取URL参数值,返回 NULL 或 值
        /// </summary>
        /// <param name="keyName">参数名</param>
        public string RequestUrlParams(string keyName)
        {
            if (Array.IndexOf(Request.QueryString.AllKeys, keyName) >= 0)
                return Request.QueryString[keyName].ToString();
            else
                return null;
        }
    }

2、这个时候我们编写一个过滤器,在这个过滤器中可以在请求的Controller中获取controller名称和action名称。 有了这两个名称就能定位到具体的页面了,当然在得到页面之前我们可以判断用户是否已经登录。而页面权限页已经用数据库保存起来:A用户或R角色对某一个Controller/Action的页面(这个页面可能是新增信息、修改、删除信息的请求链接)是否有访问权限。

    /// <summary>
    /// 用户登录过滤器
    /// </summary>
    public class UserLoginedFilter : AuthorizeAttribute
    {
        public string name { get; set; }
        /// <summary>
        /// 页面授权过程(验证用户登录状态)
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            UI.Controllers.BaseUIController _ControllerObj = (UI.Controllers.BaseUIController)filterContext.Controller;
            string controllerStr = _ControllerObj.ControllerContext.RouteData.Values["controller"].ToString();
            string actionStr = _ControllerObj.ControllerContext.RouteData.Values["action"].ToString();

            //用户尚未登陆 或 登陆超时。
            if (_ControllerObj.LoginedUserID == -1)
            {
                UserError.LoginError();
            }
            // 权限验证 根据 Controller 与 Action(这里可以将权限缓存取出来进行用户匹配,如果被拒绝可以抛出异常)
            else if ( controllerStr.ToLower() == "admin" && actionStr.ToLower() == "login")
            {
                throw new HttpException("权限验证。" + _ControllerObj.ControllerContext.Controller.ToString());
            }

            base.OnAuthorization(filterContext);
        }
    }

3、此时页面调用时就不用在每个Action中编写权限验证代码啦(有些权限验证的源码会在Action上增加过滤器,为了偷懒硬是想方设法把权限封装成直接在Controller类上添加一次过滤器就能完成的实现)

    [UserLoginedFilter]
    public class AdminController : UI.Controllers.BaseUIController
    {
        /// <summary>
        /// 登陆(登陆页面不需要权限验证,增加AllowAnonymous特性)
        /// </summary>
        [AllowAnonymous]
        public ActionResult Login(FormCollection form)
        {
            return View();
        }

        /// <summary>
        /// 主界面
        /// </summary>
        public ActionResult Index()
        {
            return View();
        }
    }

上面只是我在系统开发过程中对于权限管理的一个思路,也实实在在的应用到了一些系统中,当然上面这些代码只能勉强判断是否登陆,如果你需要对数据权限、页面权限、字段权限进行管理那么就需要进一步的扩展。如果需要在抛出异常后将异常信息友好的返回给客户端,那你仍然需要在Global中捕获返回状态码以及错误信息。因此我说这只是我的一个思路,路过的朋友给我建议。多谢!

原文地址:https://www.cnblogs.com/EvanYu/p/10556171.html

时间: 2024-10-26 02:20:42

ASP.NET MVC权限控制思路的相关文章

Asp.Net MVC 权限控制(三):Controller和Action级别控制

续接上篇:Asp.Net MVC 权限控制(二):Controller级别控制 再次在重构!这次对Controller和Action进行验证. 思路:系统有很多功能集,功能集对应很多Controller和Action,角色分配很多功能集. 首先构建一个基础数据: 1.功能集初始化: /// <summary> /// 系统模块 /// </summary> public class SystemModule { public SystemModule() { this.ID = G

Asp.Net MVC 权限控制(二):Controller级别控制

续接上篇:Asp.Net MVC 权限控制(一):使用 Authorize Roles 简单实现 由于直接在Controller上标记角色名有很大的局限性,所以本示例使用 ActionFilterAttribute 进行权限拦截. 首先创建三类标记: 1. 匿名访问标记(AnonymousAttribute)2. 登录用户访问标记(LoginAllowViewAttribute)3. 权限验证访问标记(PermissionPageAttribute) 最重要的一个权限拦截:AuthorizeFi

Asp.Net MVC 权限控制(一):使用 Authorize Roles 简单实现

最近由于项目的需要对权限控制做了几个Demo,贴出来供大家拍砖! 首先创建一个 BaseController ,让所有的Controller继承自BaseController . [Authorize] public class BaseController : Controller { } 系统登录需要一个 AccountController ,继承自BaseController ,并添加匿名访问标记 AllowAnonymous. AccountController 实现系统的登录功能,并将

关于ASP.NET MVC权限控制,通过自定义属性Attribute实现

公司打算从webform转到MVC架构,一直困扰我的就是权限控制问题.对于每一个模块,都需要判断该用户是否有访问的权限,每个用户的权限都不同,没有办法用角色权限来控制.在借鉴之前webform的实现方式和MVC的实例应用程序后,想到通过自定义Attribute来实现,实现代码如下: 1 public sealed class FunctionFilterAttribute : ActionFilterAttribute 2 { 3 private string _functionID; 4 pu

ASP.NET通用权限组件思路设计

开篇 做任何系统都离不开和绕不过权限的控制,尤其是B/S系统工作原理的特殊性使得权限控制起来更为繁琐,所以就在想是否可以利用IIS的工作原理,在IIS处理客户端请求的某个入口或出口通过判断URL来达到控制权限的目的,这样就可以减少通常要在每个页面或按钮都要添加的权限验证代码. 通常的权限验证模式 一般的权限验证会控制到菜单(页面)就可以满足,复杂一点的会要求控制到按钮(功能点),这个都需要做一下几点工作: 1.按权限生成菜单,这是所有系统都要做的: 2.在每个页面的开始处添加登录和权限的验证,调

jsp的权限控制思路

这两天接触的一个项目的权限控制思路,控制页面权限.action权限.页面内容权限 1用户 2角色 3权限组 4权限 5菜单 权限控制的5个基本模块: 用户: 用户与角色关联 角色: 角色与权限关联 给角色赋予权限:将所有权限列出: 权限组:用于归类权限 权限: 权限可以是一个菜单(当权限的url和菜单的url相同时即为菜单权限) 获取菜单列表时根据权限过滤菜单: if (menuUrl.equals(auth.getUrl()) || (user!=null && user.getId()

spring MVC 权限控制拦截

SecurityInterceptor实现spring mvc 框架的结构在访问控制@Controller之前的权限拦截,具体实现方法,增加总权限控制器 public class SecurityInterceptor extends HandlerInterceptorAdapter{ private static final Logger logger = Logger.getLogger(SecurityInterceptor.class); @Resource private Sessi

asp.net core mvc权限控制:分配权限

前面的文章介绍了如何进行权限控制,即访问控制器或者方法的时候,要求当前用户必须具备特定的权限,但是如何在程序中进行权限的分配呢?下面就介绍下如何利用Microsoft.AspNetCore.Identity.EntityFrameworkCore框架进行权限分配. 在介绍分配方法之前,我们必须理解权限关系,这里面涉及到三个对象:用户,角色,权限,权限分配到角色,角色再分配到用户,当某个用户属于某个角色后,这个用户就具有了角色所包含的权限列表,比如现在有一个信息管理员角色,这个角色包含了信息删除权

asp.net core mvc权限控制:在视图中控制操作权限

在asp.net core mvc中提供了权限验证框架,前面的文章中已经介绍了如何进行权限控制配置,权限配置好后,权限验证逻辑自动就会执行,但是在某些情况下,我们可能需要在代码里或者视图中通过手工方式判断权限,我们现在就来介绍下具体的操作方法. 如果在控制器方法里想要判断当前用户是否具有某个权限,可以直接使用HttpContext.User.HasClaim(string cliamtype,string cliamvalue)方法进行判断,该方法返回bool类型,返回true表示具有权限,否则