随笔- 28  文章- 31  评论- 16

MVC 自定义AuthorizeAttribute实现权限管理

在上一节中提到可以使用AuthorizeAttribute进行权限管理:

        [Authorize]public ActionResult TestAuthorize(){ return View();}[Authorize(Users="test1,test2")]public ActionResult TestAuthorize(){ return View();}[Authorize(Roles="Admin")]public ActionResult TestAuthorize(){ return View();}

但是通常情况下,网站的权限并不是固定不变的,当新增角色或者角色改变时,只能修改每个Action对应的特性,当项目较大时工作量可想而知。幸运的是我们可以重写AuthorizeAttribute达到自定义的权限管理。新建一个CustomAuthorizeAttribute类,使这个类继承于AuthorizeAttribute。打开AuthorizeAttribute查看下方法说明,我们只需要重写AuthorizeCore和OnAuthorization就能达到我们的目的。

// Summary://     When overridden, provides an entry point for custom authorization checks.//// Parameters://   httpContext://     The HTTP context, which encapsulates all HTTP-specific information about//     an individual HTTP request.//// Returns://     true if the user is authorized; otherwise, false.//// Exceptions://   System.ArgumentNullException://     The httpContext parameter is null.protected virtual bool AuthorizeCore(HttpContextBase httpContext);//// Summary://     Called when a process requests authorization.//// Parameters://   filterContext://     The filter context, which encapsulates information for using System.Web.Mvc.AuthorizeAttribute.//// Exceptions://   System.ArgumentNullException://     The filterContext parameter is null.public virtual void OnAuthorization(AuthorizationContext filterContext);

在CustomAuthorizeAttribute中重载AuthorizeCore方法,它的处理逻辑如下:首先判断当前账户是否被认证,如果没有,则返回false;然后获取当前账户的类型,并跟给定的类型进行比较,如果类型相同,则返回true,否则返回false。一般网站中权限管理都会使用权限树,然后将角色的权限保存至数据库或者文件中,本例中我们使用XML文件保存每个Action的角色,这样在用户请求Action时,由XML文件获取Action对应的权限,然后检测账户是否有相应的权限。CustomAuthorizeAttribute类的代码如下:

public class CustomAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute{public new string[] Roles { get; set; }protected override bool AuthorizeCore(HttpContextBase httpContext){if (httpContext == null) {throw new ArgumentNullException("HttpContext");}if (!httpContext.User.Identity.IsAuthenticated) {return false;}if (Roles == null) {return true;}if (Roles.Length == 0){return true;}if (Roles.Any(httpContext.User.IsInRole)){return true;}return false;}public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext){string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;string actionName = filterContext.ActionDescriptor.ActionName;string roles = GetRoles.GetActionRoles(actionName, controllerName);if (!string.IsNullOrWhiteSpace(roles)) {this.Roles = roles.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);}base.OnAuthorization(filterContext);}}

当用户请求一个Action时,会调用OnAuthorization方法,该方法中GetRoles.GetActionRoles(actionName, controllerName);根据Controller和Action去查找当前Action需要具有的角色类型,获得Action的Roles以后,在AuthorizeCore中与用户的角色进行比对Roles.Any(httpContext.User.IsInRole),如果没有相应权限则返回false,程序就会自动跳转到登录页面。

GetRoles为XML解析类,代码如下:

   public class GetRoles{public static string GetActionRoles(string action, string controller) {XElement rootElement = XElement.Load(HttpContext.Current.Server.MapPath("/")+"ActionRoles.xml");XElement controllerElement = findElementByAttribute(rootElement, "Controller", controller);if (controllerElement != null){XElement actionElement = findElementByAttribute(controllerElement, "Action", action);if (actionElement != null){return actionElement.Value;}}return "";}public static XElement findElementByAttribute(XElement xElement,string tagName, string attribute){return xElement.Elements(tagName).FirstOrDefault(x => x.Attribute("name").Value.Equals(attribute,StringComparison.OrdinalIgnoreCase));}}

相应的权限XMl文件:

<?xml version="1.0" encoding="utf-8" ?>
<Roles><Controller name="Home"><Action name="Index"></Action><Action name="About">Manager,Admin</Action><Action name="Contact">Admin</Action></Controller>
</Roles>

当需求发生变化时,只需要修改XML文件即可

使用时,只需要在Global.asax中注册该filter

filters.Add(new CustomAuthorizeAttribute());

当然这只是一个简单的例子,实际应用中会复杂许多,还可能要实现在即的MemberShipProvider和RoleProvider

转载于:https://www.cnblogs.com/MarchThree/p/3788271.html

C#_MVC 自定义AuthorizeAttribute实现权限管理相关推荐

  1. MVC自定义AuthorizeAttribute实现权限管理

    [转]MVC自定义AuthorizeAttribute实现权限管理 原文载自:小飞的DD http://www.cnblogs.com/feiDD/articles/2844447.html 网站的权 ...

  2. MVC 自定义AuthorizeAttribute实现权限管理

    在上一节中提到可以使用AuthorizeAttribute进行权限管理: [Authorize]public ActionResult TestAuthorize(){ return View();} ...

  3. 详解:Oracle 数据库空间表、自定义用户、权限管理、序列、同义词、索引

    一:数据库空间表 表空间是数据库逻辑结构的一个重要组件,可以存放各种应用对象,如表.索引.每一个表空间由一个或多个数据文件组成. 表空间分类: 1.永久性表空间 一般保存表.视图.过程和索引等的数据. ...

  4. asp.net mvc 实现自定义AuthorizeAttribute(权限验证)标签 无效的一种原因

    ApiController下的授权筛选attribute为System.Web.Http.AuthorizeAttribute 普通Controller用的是System.Web.Mvc.Author ...

  5. android 加网络权限管理,Android添加用户组及自定义App权限的方法

    Android:4.4.4 一.应用场景 在Android设备上,现在我们外接了一个USB转串口的设备,设备节点是/dev/ttyUSB0: # ls -l /dev/ttyUSB0 crw-rw-- ...

  6. 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(8) 权限管理,自定义权限,扩展权限...

    索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目 目录索引 简述 今天我们来做权限的管理,这篇比较多 希望新手朋友慢慢消化 项目准备 我们用的工具是:VS 2013 ...

  7. SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理...

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/weixin_44102992/article/ details/107335702 前言 提到权限管理这块肯定很多人第一想到的 ...

  8. vue自定义指令实现按钮界别权限管理

    在后台管理系统中,每个用户权限都往往需要严格分配,某些可能只具有某个列表的查看功能而没有编辑功能,这就需要对后台管理系统的每个按钮进行权限管理 自定义指令管理权限原理: 1.自定义指令,根据标签参数实 ...

  9. django认证系统实现自定义权限管理的方法 - python

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 本文记录使用django自带的认证系统实现自定义的权限管理系统,包含组权限.用户权限等实现. 0x01. django认 ...

  10. 自定义AuthorizeAttribute实现MVC权限设计

    文本为您介绍:自定义AuthorizeAttribute实现MVC权限设计,主要是通过将角色与controller.action等参数关联进行用户权限判断,然后通过自定义AuthorizeAttrib ...

最新文章

  1. oracle11g自带优化吗,windows下Oracle11g的优化教程
  2. 查mac对应ip的不同系统命令
  3. oracle 管道化表函数(Pipelined Table) [转]
  4. 邵阳一中2021高考成绩查询入口,邵阳高考成绩查询系统
  5. 文件读取 xxe_漏洞笔记|记一次与XXE漏洞的爱恨纠缠
  6. SRX alarm: Autorecovery information needs to be saved
  7. 数据结构排序法之鸡尾酒排序法he快速排序法
  8. winform 窗体中 Time 控件的用法
  9. 仿ios桌面vivo_vivo全新OriginOS细节曝光:系统UI大变样
  10. hdu4616_Game_树形DP
  11. 所有Windows原版系统的下载地址
  12. requests 职友集招聘信息爬虫
  13. OCCT 建模,VTK显示
  14. HTML网页图片引用设置
  15. TCP的滑动窗口与拥塞窗口
  16. 世界各国英文简写代码
  17. WebSphere中com/env的资源影射设置
  18. 七、Hadoop简明笔记
  19. 【Linux】安装Ubuntu18.04(启动黑屏或卡在紫屏,WiFi无法连接,安装应用)史上最全补坑,真的干货!
  20. 怎么解决pdf转换成cad格式呢?

热门文章

  1. [公告]新增项目交流区
  2. Android 四大组件学习之BroadcastReceiver四
  3. BGP(2):BGP 的报文格式
  4. 品鉴贝叶斯公式里的大道理
  5. N的倍数 51Nod - 1103 (抽屉原理)
  6. G - 罐子和硬币 (思维题)
  7. 视觉在无人驾驶中的应用及分类_紫外光在机器视觉中的应用
  8. 数论基础——扩展欧几里得算法(模板)
  9. Linux——tmux和vim常用命令总结(必会)
  10. 栈和排序---牛客练习赛10--B题