自定义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。

时间: 2024-10-26 11:03:00

自定义AuthorizeAttribute的相关文章

jquery实现的tab切换效果

  以下是源代码: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <title>div

MVC4自定义授权过滤器如何对免登录用户跳过session检查

问题描述 本人MVC新手,正在试着做权限过滤器,目前基本功能都可以实现,但是有个问题一直解决不了我通过filterContext.HttpContext.User.Identity.IsAuthenticated判断用户是否已经完成登录如果登录了就继续往下判断session是否过期,session没有过期就判断是否拥有权限可是如果用户是免登录即保存密码上来的,那么当判断到session的时候一定是null,会导致重定向到登录页.结果我就想通过filterContext.HttpContext.R

如何使用原声的AuthorizeAttribute

问题描述 自己没事,做个很简单的MVC项目,具体应用也就10个左右功能,因此在权限控制这块不想使用自定义扩展AuthorizeAttribute的方式去实现,查了些资料,感觉使用原生的功能足以.但就是不知道如何从登陆开始具体实现.比如登陆的时候的代码应该如何写,假设用户核对.及其权限都可以通过数据库获取到.我在具体的Action里设置了HttpContext.User=pri;,但貌似没什么用.还需要使用Application_AuthenticateRequest吗?如果需要应该如何写着部分代

iOS8新特性扩展(Extension)应用之四——自定义键盘控件

iOS8新特性扩展(Extension)应用之四--自定义键盘控件         iOS8系统的开放第三方键盘,使得用户在输入法的选择上更加自主灵活,也更加贴近不同语言的输入风格.这篇博客,将介绍如何开发一个第三方的键盘控件. 一.了解UIInputViewController类         UIInputViewController是系统扩展支持键盘扩展的一个类,通过这个类,我们可以自定义一款我们自己的键盘提供给系统使用.         首先,我们先来看一下这个类中的一些属性和方法:

PostgreSQL 11 preview - pgbench 变量、函数扩展 - 暨pgbench 自定义 benchmark讲解

标签 PostgreSQL , pgbench , 压测 , 变量 , tpc-b , 自定义压测 背景 pgbench是PostgreSQL软件包中的一款benchmark软件,纯C编码,效率高,压测方便. 内置TPC-B benchmark测试,同时支持自定义benchmark. 详细文档见 https://www.postgresql.org/docs/10/static/pgbench.html pgbench 自定义benchmark脚本支持的语法 变量赋值的语法 压测需要生成输入变量

AngularJS中的自定义指令的使用介绍

  这篇文章主要介绍了深入讲解AngularJS中的自定义指令的使用,AngularJS是一款热门的JavaScript开发库,需要的朋友可以参考下 AngularJS的自定义指令,就是你自己的指令,加上编译器编译DOM时运行的原生核心函数.这可能很难理解.现在,假设我们想在应用中不同页面复用一些特定的代码,而又不复制代码.那么,我们就可以简单地把这段代码放到单独的文件,并调用使用自定义指令的代码,而不是一遍又一遍地敲下来.这样的代码更容易理解.AngularJS中有四种类型的自定义指令: 元素

教你Word中创建自定义工具栏的技巧

  每个人都有不同的使用电脑的习惯,在Word中也可以让大家实现自己想要的工具栏设置,你大可根据自己的操作习惯来自定义.以下,便是进行自定义工具栏创建的技巧了,感兴趣的可以学习一下. Word 1.打开"自定义"窗口.在菜单栏的"工具"--"自定义", 打开"自定义"窗口,单击切换到"工具栏"选项卡(或者点击菜单栏的"视图"--"工具栏"--"自定义&quo

织梦ckeditor添加自定义按钮,实现自定义样式

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 织梦到了5.7之后编辑器不再是fck,而是升级成了ckeditor3.6.2.在我们对内容页面的body正文部分进行编辑的时候,前台正文部分有的时候需要一个自定义样式,但ckeditor并没有自定义样式涉及. 例如页面:http://www.badubox.com/game/500.html, 可以看到有虚线边框的地方,就是自定义样式. 当然

EMF介绍系列(四、枚举类型、自定义类型和Map)

除了普通的类(接口)以外,在类图里可以定义一些特殊的元素,比较常见的是枚举类型 .自定义类型,它们对于一个完整可用的模型也是必不可少的,这篇帖子主要介绍EMF里它们 的使用方法.另外,由于EMF对Map的支持比较特别,所以在这里也简要介绍一下Map类型的定 义方法. 枚举类型 继续前面帖子的例子,现在要为产品增加一个评分属性,评分值可以是好中差之一,像这 样属性值只能是有限几个值之一的属性就应该定义为枚举类型(Enumeration).在类图里首 先创建一个名为Score的枚举类型,然后为它增加