当前位置: 首页 > news >正文

自定义AuthorizeAttribute

网站的权限判断是一个非常普遍的需求,从文章ASP.NET MVC的Action Filter中我们知道实现这样的需求只要从AuthorizeAttribute集成,重写相关的判断逻辑就可以了。这里记录一下:

namespace TokenAcl.Web.Helper
{
    public class TokenAclAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            bool result = false;
            if (httpContext == null)
            {
                throw new ArgumentNullException("httpContext");
            }
            string[] users = Users.Split(',');
            string[] roles = Roles.Split(',');
            if (!httpContext.User.Identity.IsAuthenticated)
                return false;
            if (roles.Length != 0)
            {
                List<Role> rightRoles = RightClient.GetAllRole(TakenAclMenu.SystemID, TakenAclMenu.UserID);
                foreach (var role in roles)
                {
                    if (rightRoles.Where(x => x.Code == role).Count() > 0)
                    {
                        result = true;
                        break;
                    }
                }
            }
            if (!result)
            {
                httpContext.Response.StatusCode = 403;
            }
            return result;
        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            if (filterContext.HttpContext.Response.StatusCode == 403)
            {
                filterContext.Result = new RedirectResult("/Admin/Dashboard");
            }
        }
    }
}

从AuthorizeAttribute继承过来实现了一个类TokenAclAuthorizeAttribute ,重写了方法AuthorizeCore,使用自己开发的权限系统进行权限的验证,如果没有通过认证,这表示没有权限访问,设置HTTP 状态代码为403。 这样还是不行,还得重写另一个方法OnAuthorization。AuthorizeCore方法返回false,MVC 此时将返回的ActionResult是HttpUnauthorizedResult:

public class HttpUnauthorizedResult : ActionResult {
public override void ExecuteResult(ControllerContext context) {
if (context == null) {
throw new ArgumentNullException("context");
            }
// 401 is the HTTP status code for unauthorized access - setting this
// will cause the active authentication module to execute its default
// unauthorized handler
            context.HttpContext.Response.StatusCode = 401;
        }
    }

从HttpUnauthorizedResult的源码可以看出,HttpUnauthorizedResult的执行很简单,就是设置当前的HttpContext.Response的状态码为401,这样就回激活authentication module 执行它默认的 unauthorized handler,也就是跳转到登陆页面的,这似乎也不符合逻辑,认证和授权应该是验证的两个方面。这不符合要求,用户已经登陆成功了,只是没有权限而已。我这里只是重写OnAuthorization方法,重定向到一个页面而已,也可以写一个ActionResult。

相关文章:

  • ACL 的学习与应用 (一)
  • 三分钟理解Flash中的level层级关系
  • JDBC+Servlet+JSP整合开发之22.JSP简介
  • SQLite.NET在Win7(64位)下使用的问题
  • Unix vmstat 命令
  • 我的大学,我的先锋
  • JBPM中文乱码的一种解决方法
  • Microsoft Visual Studio 2010 官方下载地址
  • 信息化打通ONLY全身经脉!
  • Asp.Net Ajax Control Toolkit 各控件简介
  • 事务,索引和视图
  • 2010.4.25 OA项目组一周工作报告
  • VS2008中Web Reference和Service Reference的区别
  • PHP的开源项目汇总
  • 【转】安装虚拟机VMware及在VMware下安装Ghost XP系统图文教程(附PQ分区及VMwa
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • canvas绘制圆角头像
  • Consul Config 使用Git做版本控制的实现
  • eclipse的离线汉化
  • Java面向对象及其三大特征
  • JS数组方法汇总
  • php ci框架整合银盛支付
  • React Native移动开发实战-3-实现页面间的数据传递
  • React中的“虫洞”——Context
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • SQLServer之创建数据库快照
  • Vue官网教程学习过程中值得记录的一些事情
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 聊聊hikari连接池的leakDetectionThreshold
  • 设计模式(12)迭代器模式(讲解+应用)
  • 设计模式走一遍---观察者模式
  • 手写双向链表LinkedList的几个常用功能
  • 线上 python http server profile 实践
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 正则表达式小结
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #QT(智能家居界面-界面切换)
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (14)Hive调优——合并小文件
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (pojstep1.3.1)1017(构造法模拟)
  • (笔试题)合法字符串
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)关于pipe()的详细解析
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET框架
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .NET中的十进制浮点类型,徐汇区网站设计
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)