Web Api 过滤器之 AuthorizationFilter 验证过滤器
该过滤器是最先执行的过滤器,即使把它放在最后
API
[MyActionFilter]
[MyExceptionFilter]
[MyAuthorize]
public void Get()
{
Trace.WriteLine("还有谁!!!");
} public class MyActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
Trace.WriteLine("我是 Action 过滤器 OnActionExecuting 方法");
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
Trace.WriteLine("我是 Action 过滤器 OnActionExecuted 方法");
}
} public class MyAuthorizeAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
Trace.WriteLine("我是 Authorization 过滤器");var headers = actionContext.Request.Headers;
var authorization = headers.Authorization;
var validateResult = authorization != null && authorization.Scheme.Equals("mima")&&authorization.Parameter.Equals("");
if (!validateResult)
{
//actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized)
//{
// Content = new StringContent("授权未通过")
//}; //从方法名来看,感觉这种写法比上面注释掉的要符合规范一点
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "授权未通过");
}
}
}
客户端调用:
static void Main(string[] args)
{
using (var client = HttpClient())
{
client.BaseAddress = new Uri("http://localhost:58254");
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("mima","");
client.GetAsync("api/test/get").ContinueWith(GetResponse);
Console.WriteLine("这是主线程,我最先被显示出来");
Console.ReadKey();
}
} private static void GetResponse(Task<HttpResponseMessage> obj)
{
var getResult = obj.Result;
var str = getResult.IsSuccessStatusCode ? "请求成功!" : "请求失败";
Console.WriteLine(str);
var readResult = getResult.Content.ReadAsStringAsync();
Console.WriteLine(readResult.Result);
}
运行结果:
权限验证基本上每个API都一样,所以都是注册的全局:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务 //跨域
EnableCrossSiteRequests(config); //注册过滤器
config.Filters.Add(new MyAuthorizeAttribute()); ......
如果想让某些API不进行验证,比如登录等,则可以进行如下处理:
1.再不需要验证的 Controller 或者 Action 上面打上 [AllowAnonymous]
[RoutePrefix("api/test")]
public class TestController : ApiController
{ [MyActionFilter]
[MyExceptionFilter]
[MyAuthorize]
[AllowAnonymous]
public void Get()
{
Trace.WriteLine("还有谁!!!");
}
2.
public class MyAuthorizeAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
Trace.WriteLine("我是 Authorization 过滤器"); //检查当前请求的 Action 是否有[AllowAnonymous],有的话则直接返回,不再进行下面的验证
if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any())
{
return;
} //检查当前请求的 Controller 是否有[AllowAnonymous],有的话则直接返回,不再进行下面的验证
if (actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any())
{
return;
}
Web Api 过滤器之 AuthorizationFilter 验证过滤器的更多相关文章
- Web Api 过滤器之 ExceptionFilter 异常过滤器
一.服务器出现异常,会统一向客户端返回 500 的错误. [RoutePrefix("api/test")] public class TestController : ApiCo ...
- asp.net core MVC 全局过滤器之ExceptionFilter异常过滤器(一)
本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter异常过滤器(一) asp.net cor ...
- Web API中的模型验证
一.模型验证的作用 在ASP.NET Web API中,我们可以使用 System.ComponentModel.DataAnnotations 命名空间中的属性为模型上的属性设置验证规则. 一个模型 ...
- ASP.NET Web API 2 之参数验证
Ø 前言 目前 C# 比较流行使用 ASP.NET Web API 来承载 Web 接口,提供与客户端之间的数据交互,现在的版本已经是 2.0 了.既然是接口就少不了对输入参数的验证,所以本文主要探 ...
- Web API中的模型验证Model Validation
数据注释 在ASP.NET Web API中,您可以使用System.ComponentModel.DataAnnotations命名空间中的属性为模型上的属性设置验证规则. using System ...
- ASP.NET MVC View 和 Web API 的基本权限验证
ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Mi ...
- ASP.NET Web API 2 使用 AuthorizationFilter(授权过滤器)实现 Basic 认证
Ø 前言 在 Web 项目中授权认证方式有很多种,本文主要讲述基于 Basic 的认证方式.这是一种比较简单.常见的认证方式,主要是将请求的用户名和密码进行加密后返回给调用方,比较适合采用用户名.密 ...
- 十五:jinja2过滤器之实现自定义过滤器
过滤器的本质就是函数,如果在模板中调用这个过滤器,那么就会将这个变量的值作为第一个参数传给过滤器函数,然后将函数的返回值作为滤器的返回值 1.在python文件中写好过滤的函数和逻辑2.将将函数注册到 ...
- .Net Core3.0 WEB API 中使用FluentValidation验证,实现批量注入
为什么要使用FluentValidation 1.在日常的开发中,需要验证参数的合理性,不紧前端需要验证传毒的参数,后端也需要验证参数 2.在领域模型中也应该验证,做好防御性的编程是一种好的习惯(其实 ...
随机推荐
- centos7.2 配置内网ntp服务器进行时间同步
(一)修改/etc/ntp.conf 配置文件,注意红色部分,其他部分不需要改 ########################################################### ...
- MySQL数据库索引简介
一.索引的含义和特点 索引是一个单独的.存储在磁盘上的数据库结构,他们包含着对数据表里所有记录的引用指针.使用索引用于快速找出某个或多个列中有一特点值的行,所用MySQL列类型都可以被索引,对 ...
- Hadoop2.x 体系结构和源码编译
体系结构 Hadoop1的核心组成包括HDFS和MapReduce.HDFS和MapReduce的共同点就是他们都是分布式的. HDFS是包括主节点NameNode,只有一个,还有很多从节点DataN ...
- 用Node.js写爬虫,撸羞羞的图片
说到爬虫,很多人都认为是很高大上的东西.哇塞,是不是可以爬妹纸图啊,是不是可以爬小片片啊.答案就是对的.爬虫可以完成这些东西的操作.但是,作为一个正直的程序员,我们要在法律允许范围内用爬虫来为我们服务 ...
- Java设计模式(五)Prototype原型模式
一.场景描述 创建型模式中,从工厂方法模式,抽象工厂模式,到建造者模式,再到原型模式,我的理解是,创建对象的方式逐步从编码实现转向内存对象处理. 例如,在“仪器数据采集器”的子类/对象“PDF文件数据 ...
- Java读取properties文件连接数据库
先说为什么要有这种东西,或者我们为什么要用这种方式来写,先看经常用的方法,我们经常写的 package util; import java.sql.Connection; import java.sq ...
- Mycat 配置说明(server.xml)
server.xml 几乎保存了所有mycat需要的系统配置信息,包括 mycat 用户管理.DML权限管理等,其在代码内直接的映射类为SystemConfig 类. user 标签 该标签主要用于定 ...
- svn打分支
http://www.07net01.com/linux/Eclipsexiasvndechuangjianfenzhi_hebing_qiehuanshiyong_548928_1374750252 ...
- 详细分析SQL语句逻辑执行过程和相关语法
本文目录: 1.SQL语句的逻辑处理顺序 1.2 各数据库系统的语句逻辑处理顺序 1.2.1 SQL Server和Oracle的逻辑执行顺序 1.2.2 MariaDB的逻辑执行顺序 1.2.3 M ...
- Algorithm --> 并查集
并查集 主要解决图的连通性问题,比如: 1.随意给你两个点,让你判断它们是否连通: 2.问你整幅图一共有几个连通分支: 初始化: void init(int size) { ; i < size ...