在.NET中有两个AuthorizeAttribute类,

一个定义在System.Web.Http命名空间下

#region 程序集 System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// E:\src\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll
#endregion using System.Web.Http.Controllers;
using System.Web.Http.Filters; namespace System.Web.Http
{
//
// 摘要:
// 指定用于验证请求的 System.Security.Principal.IPrincipal 的授权筛选器。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : AuthorizationFilterAttribute
{
//
// 摘要:
// 初始化 System.Web.Http.AuthorizeAttribute 类的新实例。
public AuthorizeAttribute(); //
// 摘要:
// 获取或设置授权角色。
//
// 返回结果:
// 角色字符串。
public string Roles { get; set; }
//
// 摘要:
// 获取此特性的唯一标识符。
//
// 返回结果:
// 此特性的唯一标识符。
public override object TypeId { get; }
//
// 摘要:
// 获取或设置授权用户。
//
// 返回结果:
// 用户字符串。
public string Users { get; set; } //
// 摘要:
// 为操作授权时调用。
//
// 参数:
// actionContext:
// 上下文。
//
// 异常:
// T:System.ArgumentNullException:
// 上下文参数为 null。
public override void OnAuthorization(HttpActionContext actionContext);
//
// 摘要:
// 处理授权失败的请求。
//
// 参数:
// actionContext:
// 上下文。
protected virtual void HandleUnauthorizedRequest(HttpActionContext actionContext);
//
// 摘要:
// 指示指定的控件是否已获得授权。
//
// 参数:
// actionContext:
// 上下文。
//
// 返回结果:
// 如果控件已获得授权,则为 true;否则为 false。
protected virtual bool IsAuthorized(HttpActionContext actionContext);
}
}

另一个在System.Web.Mvc命名空间下

#region 程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// E:\src\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll
#endregion namespace System.Web.Mvc
{
//
// 摘要:
// 指定对控制器或操作方法的访问只限于满足授权要求的用户。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
//
// 摘要:
// 初始化 System.Web.Mvc.AuthorizeAttribute 类的新实例。
public AuthorizeAttribute(); //
// 摘要:
// 获取或设置有权访问控制器或操作方法的用户角色。
//
// 返回结果:
// 有权访问控制器或操作方法的用户角色。
public string Roles { get; set; }
//
// 摘要:
// 获取此特性的唯一标识符。
//
// 返回结果:
// 此特性的唯一标识符。
public override object TypeId { get; }
//
// 摘要:
// 获取或设置有权访问控制器或操作方法的用户。
//
// 返回结果:
// 有权访问控制器或操作方法的用户。
public string Users { get; set; } //
// 摘要:
// 在过程请求授权时调用。
//
// 参数:
// filterContext:
// 筛选器上下文,它封装有关使用 System.Web.Mvc.AuthorizeAttribute 的信息。
//
// 异常:
// T:System.ArgumentNullException:
// filterContext 参数为 null。
public virtual void OnAuthorization(AuthorizationContext filterContext);
//
// 摘要:
// 重写时,提供一个入口点用于进行自定义授权检查。
//
// 参数:
// httpContext:
// HTTP 上下文,它封装有关单个 HTTP 请求的所有 HTTP 特定的信息。
//
// 返回结果:
// 如果用户已经过授权,则为 true;否则为 false。
//
// 异常:
// T:System.ArgumentNullException:
// httpContext 参数为 null。
protected virtual bool AuthorizeCore(HttpContextBase httpContext);
//
// 摘要:
// 处理未能授权的 HTTP 请求。
//
// 参数:
// filterContext:
// 封装有关使用 System.Web.Mvc.AuthorizeAttribute 的信息。filterContext 对象包括控制器、HTTP 上下文、请求上下文、操作结果和路由数据。
protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext);
//
// 摘要:
// 在缓存模块请求授权时调用。
//
// 参数:
// httpContext:
// HTTP 上下文,它封装有关单个 HTTP 请求的所有 HTTP 特定的信息。
//
// 返回结果:
// 对验证状态的引用。
//
// 异常:
// T:System.ArgumentNullException:
// httpContext 参数为 null。
protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext);
}
}

两者主要区别在于:

  • System.Web.Http 这个主要是用在Web Api

  • System.Web.Mvc 这个主要用在 ASP.NET MVC
  • System.Web.Http 版本中,传入参数为HttpActionContext
    public override void OnAuthorization(HttpActionContext actionContext);

    System.Web.Mvc版本中,传入参数为AuthorizationContext

    public virtual void OnAuthorization(AuthorizationContext filterContext);

看似相同,但是在处理自定义权限的时候,两者思路相近实际实现方式上有很大的差别。

下面列出两种属性下获取Cookie的不同:

MVC:

public class Foo : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
HttpCookie cookie = filterContext.HttpContext.Request.Cookies.Get("Bar");
}
}

HTTP(Web Api):

public class Foo : AuthorizeAttribute
{ public override void OnAuthorization(HttpActionContext actionContext)
{
var cookies = actionContext.Request.Headers.GetCookies("Bar").FirstOrDefault(); var cookie = cookies["Bar"];
}
}

还有就是自定义权限处理的时候,写法也不尽相同,后续文章会进行介绍

ASP.NET WebApi总结之自定义权限验证的更多相关文章

  1. springboot + 拦截器 + 注解 实现自定义权限验证

    springboot + 拦截器 + 注解 实现自定义权限验证最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定义 ...

  2. Asp.Net WebApi一个简单的Token验证

    1.前言: WebAPI主要开放数据给手机APP,Pad,其他需要得知数据的系统,或者软件应用.Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能.我上次写的<Asp.Net MV ...

  3. ASP.NET Core 下自定义权限验证

    效果图: 如果没有权限时,显示: 代码: public class AuthorizeAdminAttribute : TypeFilterAttribute { #region 字段 private ...

  4. webapi使用jwt做权限验证

    考虑到很多公司目前并没有切换到.netcore,所有本文尝试使用.netframework下的webapi 首先使用Nuget 安装 jwt包 安装完成后,创建 jwt的帮助类 public clas ...

  5. Asp.net Core 系列之--5.认证、授权与自定义权限的实现

    ChuanGoing 2019-11-24 asp.net core系列已经来到了第五篇,通过之前的基础介绍,我们了解了事件订阅/发布的eventbus整个流程,初探dapper ORM实现,并且简单 ...

  6. 自定义shiro实现权限验证方法isAccessAllowed

    由于Shiro filterChainDefinitions中 roles默认是and, admin= user,roles[system,general] 比如:roles[system,gener ...

  7. [Abp 源码分析]十一、权限验证

    0.简介 Abp 本身集成了一套权限验证体系,通过 ASP.NET Core 的过滤器与 Castle 的拦截器进行拦截请求,并进行权限验证.在 Abp 框架内部,权限分为两块,一个是功能(Featu ...

  8. springboot2.0整合springsecurity前后端分离进行自定义权限控制

    在阅读本文之前可以先看看springsecurity的基本执行流程,下面我展示一些核心配置文件,后面给出完整的整合代码到git上面,有兴趣的小伙伴可以下载进行研究 使用maven工程构建项目,首先需要 ...

  9. sa-token 之权限验证

    权限验证 核心思想 所谓权限验证,验证的核心就是当前账号是否拥有一个权限码 有:就让你通过.没有:那么禁止访问 再往底了说,就是每个账号都会拥有一个权限码集合,我来验证这个集合中是否包括我需要检测的那 ...

随机推荐

  1. Git 知识总结

    版本控制git之一 - 仓库管理 版本控制git之二-分支 git https://mp.weixin.qq.com/s/96FS12DTzbjAJQ1ynRNqdg git init 初始化目录 g ...

  2. 5 MySQL--表--数据类型

    存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data-type ...

  3. 如何在ArcMap中监听键盘鼠标事件(转)

    如何在ArcMap中监听键盘鼠标事件(转) Link: http://www.cnblogs.com/dyllove98/p/3155551.html 昨天有个朋友想要实现一个功能,就是在ArcMap ...

  4. 最全最详细的用JS过滤Emoji表情的输入

    在前端页面开发过程中,总会碰到不允许输入框输入emoji表情的需求,我的思路是通过编码用正则匹配表情,然后将其替换为空字符创.但是问题也是显而易见的,完整的编码集是什么呢?查阅了官方文档,发现上面并没 ...

  5. shell脚本通过expect脚本实现自动输入密码

     背景:在远程文件下载时,需要输入对方的服务器密码,shell不支持交互输入内容,可以用下面两种方式实现   一.在shell脚本中嵌入expect来实现密码输入 expect是一个自动交互功能的工具 ...

  6. [C++] STL相关面试题

    (1) 为何map和set的插入删除效率比用其他序列容器高? 因为map和set的内部数据结构是红黑树,它的插入和删除不需做内存的拷贝和移动.(红黑树的插入和删除是log(n)的). (2) 为何每次 ...

  7. OAuth2.0协议之新浪微博接口演示

    新浪微博接口调用数据代码: <?php /** * @ Author : LiBo * @ Date : 2013-10-25 * @ File : weiboapi.php * * @ 说明: ...

  8. 打劫房屋 · House Robber

    [抄题]: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警 ...

  9. zabbix监控阅读目录

    一.zabbix安装 点击查看:http://www.cnblogs.com/hwlong/p/5820321.html 二.解决乱码问题 点击查看:http://www.cnblogs.com/hw ...

  10. Disruptor 系列(二)使用场景

    Disruptor 系列(二)使用场景 今天用一个订单问题来加深对 Disruptor 的理解.当系统中有订单产生时,系统首先会记录订单信息.同时也会发送消息到其他系统处理相关业务,最后才是订单的处理 ...