ASP.NET MVC4 自定义权限(角色)验证
2017-09-30 17:49
363 查看
开发系统的时候,两个基本的模块是少不了的,那就是 —— 身份验证 和权限。上一篇文章我们介绍了ASP.NET MVC 身份验证,今天我们来说一下权限管理。
下面我们一步步介绍一下是如何实现的。
其实 权限过滤器 它也属于过滤器的范畴
1、OnAuthorization: 核心方法,权限过滤器的入口。
2、AuthorizeCore : 核心验证方法,验证的自定义逻辑要放在这个方法里。
3、HandleUnauthorizedRequest : 验证失败后,调用的处理方法,处理验证失败,放在这个方法里。
1、 复写 OnAuthorization 方法,在该方法里 执行父类的OnAuthorization方法。(个人感觉可以省略)
2、复写 AuthorizeCore方法,上面已经介绍过了,这个方法里 描述的是核心验证逻辑,父类的
OnAuthorization 里 是调用了 AuthorizeCore 这个方法去 验证 是否具有权限的。
这里还涉及到了一点 多态 的 知识(我们在 复写 父类的方法后,父类执行 AuthorizeCore 的方法,是子类的AuthorizeCore 的方法)
3、父类的 OnAuthorization 在使用 子类AuthorizeCore 验证后,验证成功后,会让请求 继续向下执行,
如果失败,与上面同样的道理将会调用子类的HandleUnauthorizedRequest方法,去处理不具有权限
的请求。
上面介绍了原理,下面我简单说一下 是 如何自定义AuthorizeCore验证方法的,以及验证失败后是如
何去处理的HandleUnauthorizedRequest。
AuthorizeCore 验证方法思路:
在这个方法里首先 httpContext.Request.IsAuthenticated 进行身份验证,身份验证通过之后;
获取身份验证的Cookie 并将 我存在cookie里的用户信息,提取出来。(我存储了 用户名,角色,ID,头像等)
获取到用户信息之后,你允许什么样的用户通过呐?那就是你随意自定义了,比如说:我定义的允许就是 你的权限(RoleID)大于我设置的权限,那你就可以通过,否则我就返回false,而后就进入了 HandleUnauthorizedRequest方法。
HandleUnauthorizedRequest 验证失败请求处理 思路
如果未异步请求,使用 filterContext.Result返回Json 数据。
如果未同步请求,使用 base.HandleUnauthorizedRequest(filterContext) 父类的处理方法去解决就可以了(父类的处理方式是跳 登录页)
其他参考博文:
http://www.cnblogs.com/duanxian/p/5712680.html(重写无权限访问方法)
http://blog.csdn.net/gulijiang2008/article/details/8142000(大体思路)
http://www.cnblogs.com/landeanfen/p/5287064.html
http://blog.csdn.net/gulijiang2008/article/details/8142000
1. 需求:
当普通用户 进行编辑、删除操作时,系统拒绝用户的访问,若访问为异步操作,则返回 JSON数据,给出提示消息(权限不足),若为同步操作,则跳转登录页。2. 效果:
当我以普通用户身份(user)登陆后,进行删除操作,系统拒绝了我的操作,并将消息返回给了我。下面我们一步步介绍一下是如何实现的。
3. 自定义实现的实现
3.1 代码效果
当我 希望 Create方法只能 管理员具有权限的创建的时候,在该方法 加上 这个特性。RoleAuthorize 是我们自定义 的权限过滤器,下一小节中将介绍它。将该特性放在 Action,将对请求进行过滤,不符合权限请求,将被筛选。其实 权限过滤器 它也属于过滤器的范畴
3.2 实现原理
ASP.NET MVC 自定义权限控制,是通过 继承 AuthorizeAttribute 类来实现的。下面介绍一下 AuthorizeAttribute 的核心方法,需要我们进行复写,自定义。1、OnAuthorization: 核心方法,权限过滤器的入口。
2、AuthorizeCore : 核心验证方法,验证的自定义逻辑要放在这个方法里。
3、HandleUnauthorizedRequest : 验证失败后,调用的处理方法,处理验证失败,放在这个方法里。
3.3 实现代码
下面是代码,在这儿简单介绍一下 自定义权限验证的逻辑。1、 复写 OnAuthorization 方法,在该方法里 执行父类的OnAuthorization方法。(个人感觉可以省略)
2、复写 AuthorizeCore方法,上面已经介绍过了,这个方法里 描述的是核心验证逻辑,父类的
OnAuthorization 里 是调用了 AuthorizeCore 这个方法去 验证 是否具有权限的。
这里还涉及到了一点 多态 的 知识(我们在 复写 父类的方法后,父类执行 AuthorizeCore 的方法,是子类的AuthorizeCore 的方法)
3、父类的 OnAuthorization 在使用 子类AuthorizeCore 验证后,验证成功后,会让请求 继续向下执行,
如果失败,与上面同样的道理将会调用子类的HandleUnauthorizedRequest方法,去处理不具有权限
的请求。
上面介绍了原理,下面我简单说一下 是 如何自定义AuthorizeCore验证方法的,以及验证失败后是如
何去处理的HandleUnauthorizedRequest。
AuthorizeCore 验证方法思路:
在这个方法里首先 httpContext.Request.IsAuthenticated 进行身份验证,身份验证通过之后;
获取身份验证的Cookie 并将 我存在cookie里的用户信息,提取出来。(我存储了 用户名,角色,ID,头像等)
获取到用户信息之后,你允许什么样的用户通过呐?那就是你随意自定义了,比如说:我定义的允许就是 你的权限(RoleID)大于我设置的权限,那你就可以通过,否则我就返回false,而后就进入了 HandleUnauthorizedRequest方法。
HandleUnauthorizedRequest 验证失败请求处理 思路
如果未异步请求,使用 filterContext.Result返回Json 数据。
如果未同步请求,使用 base.HandleUnauthorizedRequest(filterContext) 父类的处理方法去解决就可以了(父类的处理方式是跳 登录页)
/// <summary> /// 自定义权限(角色)验证 /// </summary> public class RoleAuthorizeAttribute: AuthorizeAttribute { /// <summary> /// 验证入口 /// </summary> /// <param name="filterContext"></param> public override void OnAuthorization(AuthorizationContext filterContext) { base.OnAuthorization(filterContext); } /// <summary> /// 验证核心代码 /// </summary> /// <param name="httpContext"></param> /// <returns></returns> protected override bool AuthorizeCore(HttpContextBase httpContext) { byte roleid = 0; AdminModel loginUser = new AdminModel(); if (! httpContext.Request.IsAuthenticated) { //非异步请求,跳转登录页,异步请求则交给身份验证过滤器处理(代码在执行的时候,将先执行身份验证,也就是AuthorizeAttribute类,而后才会执行过滤器。 所以如果说,身份验证是通过 过滤器实现的话,这一步判断是必须的。) if (!httpContext.Request.IsAjaxRequest()) { FormsAuthentication.RedirectToLoginPage();//重定向会登录页 } return false;//未登录返回 false } else { //登录状态获取用户信息 var cookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName]; var ticket = FormsAuthentication.Decrypt(cookie.Value); loginUser = new JavaScriptSerializer().Deserialize<AdminModel>(ticket.UserData); roleid = FrameworkStatic.GetRoleID(this.Roles); } return IsAllow(loginUser.RoleID, roleid); } /// <summary> /// 验证失败处理 /// </summary> /// <param name="filterContext"></param> protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if (filterContext.HttpContext.Request.IsAjaxRequest()) { filterContext.Result = new JsonResult { Data = new { Status = -1, Message = "权限不足,服务器已拒绝您的操作!" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } else base.HandleUnauthorizedRequest(filterContext); return; } /// <summary> /// 判断当前用户权限是否大于目标操作权限(权限向下兼容) /// </summary> /// <param name="currentRoleId">当前角色</param> /// <param name="targetRoleId">目标角色</param> /// <returns>是否允许</returns> private bool IsAllow(byte currentRoleId,byte targetRoleId) { return currentRoleId >= targetRoleId; } }
参考博文
权限系统控制实现(推荐)其他参考博文:
http://www.cnblogs.com/duanxian/p/5712680.html(重写无权限访问方法)
http://blog.csdn.net/gulijiang2008/article/details/8142000(大体思路)
http://www.cnblogs.com/landeanfen/p/5287064.html
http://blog.csdn.net/gulijiang2008/article/details/8142000
相关文章推荐
- ASP.NET MVC 窗体身份验证及角色权限治理示例
- asp.net中的窗体身份验证(不同的角色访问不同的目录)
- asp.net 中用户和角色的验证
- 从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程
- ASP.NET MVC:窗体身份验证及角色权限管理示例
- 结合shiro使用aop自定义权限验证
- ASP.NET MVC4入门教程(六):验证编辑方法和编辑视图
- .net基于角色安全性验证的几个概念
- WCF RIA 服务 (三十一)-- 身份验证、角色、个性化 2
- Asp.net中基于Forms验证的角色验证授权
- [Asp.Net MVC4]验证用户登录实现
- [Asp.Net MVC4]验证用户登录实现
- Asp.net2.0身份验证技术学习入门---角色管理(三)
- [.NET 基于角色安全性验证] 之三:ASP.NET Forms 身份验证
- Asp.net中基于Forms验证的角色验证授权
- Asp.Net中基于Forms验证的角色验证授权
- asp.net中使用基于角色的身份Forms验证 (1)
- 【自然框架】之通用权限的Demo(二):添加人员、添加账户、添加角色里面的账户以及列表的权限验证
- Asp.Net Forms验证(自定义、角色提供程序、单点登录)
- 关于微软自带的身份和角色验证