前言

咱们上篇说到,过滤的简单介绍,但是未介绍如何使用,接下来几篇,我来给大家讲讲如何使用,今天第一篇是Authorization。认证过滤器,

开发环境介绍

  • 开发工具:VS2019
  • 开发环境:.net core 3.1

1.创建项目



首先创建一个Api的项目,选择.net core的版本,选择好,点击创建即可

2 创建一个自定义类

public class AuthenticationTest: IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
//逻辑处理
}
}

查看IAuthorizationFilter源代码

IAuthorizationFilter接口只有一个方法OnAuthorization,

创建一个类,继承IAuthorizationFilter接口,然后实现一下接口方法。是不是有点疑问,AuthorizationFilterContext是什么?

3 AuthorizationFilterContext是什么?

中文理解:授权过滤器上下文

六大属性:

  • ActionDescriptor:获取或设置所选动作的ActionDescriptor。(获取请求的Method)
  • Filters:获取所有适用的IFilterMetadata实现。(可以检测请求的Action是否具备AllowAnonymous,如果有,则直接跳过AuthorizationFilter滤器)
  • HttpContext:获取或设置当前请求的HttpContext。(获取当前请求的很多信息,例如当前用户信息,当前请求的Heads[可以从Head获取Token,即验证Token])
  • ModelState:获取模型状态字典。在你使用MVC框架下,对Molde进行验证的时候才会使用到,去验证模型是否验证通过。
  • Result:获取或设置请求的结果。将结果设置为null授权过滤器内的非值将使过滤器管道的其余部分短路。
  • RouteData:获取或设置当前请求的RouteData。(获取当前路由的信息)

4 编写简答的业务逻辑

    public class AuthenticationTest: IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
Console.WriteLine("我是Authorization过滤器");
//请求的地址
var url = context.HttpContext.Request.Path.Value;
#region 打印头部信息
var heads = context.HttpContext.Request.Headers;
string msg = string.Empty; foreach (var item in heads)
{
msg += item.Key + ":" + item.Value + "\r\n";
} Console.WriteLine("我是heads:" + msg);
#endregion
}
}

5 注册全局过滤器

找到Startup.cs文件,然后找到其中一个方法ConfigureServices,将代码修改为这样:

 public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(); //全局添加过滤器
#region 全局过滤器
services.AddMvc(a => {
a.Filters.Add<AuthenticationTest>();
});
#endregion
}

6.启动项目(这里是使用Kestrel作为服务器启动,启动的是控制台程序)

启动之后,会在控制台打印如上图所示,我们可以获取当前请求的Head信息。如果Head包含Token,我们也是可以获取token,然后验证token,后面可以进行一系列自己的逻辑运算。

7.1扩展IAsyncAuthorizationFilter

过滤器还存在一个异步过滤器,它是继承IAsyncAuthorizationFilter

    public class AsyncAuthentication : IAsyncAuthorizationFilter
{
public Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
return Task.CompletedTask;
}
}

异步确认请求授权的过滤器,和之前的IAuthorizationFilter区别,大家显而易见,只是处理请求的方式不一样,一个是同步,一个是异步,如果了解线程,就应该了解二者的区别,在这只做简单介绍,编写你自己业务逻辑,可以自由编写。

7.2 扩展:修改401返回的返回值

正常的401报错:

public class AuthenticationTest: IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
context.Result = new StatusCodeResult(401);
}
}

效果如下图:

这种并不是客户想看到的,我们可以自定义返回值。

自定义的401报错:

 public class AuthenticationTest: IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
context.Result = new JsonResult(new { StatusCodeResult = StatusCodes.Status401Unauthorized, Title = "401", Time = DateTime.Now,test="测试" });
}
}

效果如下图:

自定义设置返回的值,是没有限制,可以根据场景进行自定义,合适才是最好。

8.总结:

通过上面的一顿操作,我们应该能明白,一个自定义的权限过滤器的创建,注册,使用等。这个过滤器让我们能控制用户的请求,哪些是请求是当前用户可以匿名登录,哪些请求是当前用户无权访问的,在一方面,可以帮助我编写自定义的权限管理,还是那句话,合适才是重要的!

.net core中的哪些过滤器 (Authorization篇)的更多相关文章

  1. 文章翻译:ABP如何在EF core中添加数据过滤器

    原文地址:https://aspnetboilerplate.com/Pages/Documents/Articles%5CHow-To%5Cadd-custom-data-filter-ef-cor ...

  2. 对象池在 .NET (Core)中的应用[2]: 设计篇

    <编程篇>已经涉及到了对象池模型的大部分核心接口和类型.对象池模型其实是很简单的,不过其中有一些为了提升性能而刻意为之的实现细节倒是值得我们关注.总的来说,对象池模型由三个核心对象构成,它 ...

  3. .net core中的哪些过滤器

    前言 书承接上文,咱们上回说到,.net core中各种日志框架, 今天我讲讲.net core中的内置过滤器吧! 1.什么是过滤器? ASP.NET Core中的筛选器允许代码在请求处理管道中的特定 ...

  4. 第十五节:Asp.Net Core中的各种过滤器(授权、资源、操作、结果、异常)

    一. 简介 1. 说明 提到过滤器,通常是指请求处理管道中特定阶段之前或之后的代码,可以处理:授权.响应缓存(对请求管道进行短路,以便返回缓存的响应). 防盗链.本地化国际化等,过滤器用于横向处理业务 ...

  5. ASP.NET Core中使用自定义MVC过滤器属性的依赖注入

    除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作. ASP.NET Core中常用的 ...

  6. 如何在ASP.NET Core中编写高效的控制器

    ​通过遵循最佳实践,可以编写更好的控制器.所谓的"瘦"控制器(指代码更少.职责更少的控制器)更容易阅读和维护.而且,一旦你的控制器很瘦,可能就不需要对它们进行太多测试了.相反,你可 ...

  7. 在Asp.Net Core中集成Kafka

    在我们的业务中,我们通常需要在自己的业务子系统之间相互发送消息,一端去发送消息另一端去消费当前消息,这就涉及到使用消息队列MQ的一些内容,消息队列成熟的框架有多种,这里你可以读这篇文章来了解这些MQ的 ...

  8. [转]ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

    本文转自:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_4_3-filters.html 原文:Filters 作者:Steve Smith 翻 ...

  9. ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

    原文:Filters 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐 ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码.过滤器可以配置为全局有效.仅对控 ...

随机推荐

  1. localStorage使用小结

    一.什么是localStorage.sessionStorage 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题 ...

  2. mysql 登陆与退出

    Mysql登陆与退出 登陆参数 登陆命令 mysql -uroot -p 回车输入密码 退出有三个命令:  exit  quit  \q 修改mysql提示符 连接mysql客户端时通过参数指定: 登 ...

  3. centos7安装kafka 转

    CentOS7安装和使用kafka         环境准备 安装kafka之前我们需要做一些环境的准备 1.centOS7系统环境 2.jdk环境 3.可用的zookeeper集群服务 安装jdk ...

  4. spring boot:使接口返回统一的RESTful格式数据(spring boot 2.3.1)

    一,为什么要使用REST? 1,什么是REST? REST是软件架构的规范体系,它把资源的状态用URL进行资源定位, 以HTTP动作(GET/POST/DELETE/PUT)描述操作 2,REST的优 ...

  5. 简述 QPS、TPS、并发用户数、吞吐量关系

    1. QPS QPS Queries Per Second 是每秒查询率 ,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准, 即每秒的响应请求数,也即 ...

  6. 圆形进度条的模仿1-DrawArc,DrawCircle,DrawText讲解

    1:画弧 canvas.drawArc(oval,startAngle,sweepAngle,useCenter,paint) 第一个参数:绘制的区域,oval可以是被定好了的一个区域,也可以将ova ...

  7. mysql复制一个表到其他数据库

    db1为原数据库,db2为要导出到的数据库,fromtable 是要导出的表名1.方法一:登录导出到的数据库,执行create table fromtable select * from db1.fr ...

  8. Nginx02---配置文件

    Nginx(二)------nginx.conf 配置文件   目录 1.nginx.conf 的主体结构 2.全局块 3.events 块 4.http 块 ①.http 全局块 ②.server ...

  9. 「IDEA插件精选」安利一个IDEA骚操作:一键生成方法的序列图

    在平时的学习/工作中,我们会经常面临如下场景: 阅读别人的代码 阅读框架源码 阅读自己很久之前写的代码. 千万不要觉得工作就是单纯写代码,实际工作中,你会发现你的大部分时间实际都花在了阅读和理解已有代 ...

  10. 解决LINK : fatal error LNK1104: 无法打开文件“xxxx.lib”

    举个例子