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.在领域模型中也应该验证,做好防御性的编程是一种好的习惯(其实 ...
随机推荐
- mysql大小写敏感问题
问题: 在创建mysql表的时候发现不论表明是大写或小写,建完之后统一被变成了小写. 原因: MySQL在windows下是不区分大小写的,将script文件导入MySQL后表名也会自动转化为小写. ...
- Android端 高德地图点击得到经纬度
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...
- Linux性能分析工具与图形化方法
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:赵坤|腾讯魔王工作室后台开发工程师 在项目开发中,经常会遇到程序启动时间过长.CPU使用率过高等问题,这个时候需要依靠性能分析工具来 ...
- php seaslog的使用
今天有幸在慕课网看到了 关于php日志处理工具 seasLog 的使用视频,本着好奇看完了该视频,觉得不错,便自己也倒腾了下,现在整理出来 seaslog github: https://githu ...
- SpringMVC【参数绑定、数据回显、文件上传】
前言 本文主要讲解的知识点如下: 参数绑定 数据回显 文件上传 参数绑定 我们在Controller使用方法参数接收值,就是把web端的值给接收到Controller中处理,这个过程就叫做参数绑定.. ...
- unix命令
最近需要用到一些Unix的东西 ,就学习了下这个东西,简单记录下命令,方便以后查询! 1. ls这是最基本的档案指令. ls 的意义为 "list",也就是将某一个目录或是某一个档 ...
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListene解决办法
照着以前写的项目搭一个框架,项目用到的是ssm,spring+spring mvc+mybatis,由Eclipse转战IDEA上,项目的文件夹有一些改变,在之前的小项目中喜欢把lib文件夹放在项目根 ...
- 最小化安装CentOS7的网卡设置
实验环境:CentOS 7 Minimal Installation 64bit (1511) 最小化安装CentOS 7 后,查看网卡的信息让人很意外,因为网卡的命名规则变了,网卡的名字让人很难懂. ...
- oracle10g 基于linux6安装问题收集
1.[oracle@rsyslogserver database]$ dbca -silent -responseFile /home/oracle/database/dbca.rsp No comm ...
- java必学的5种排序算法
第一种冒泡排序 第二种 选择排序 第三种.插入排序