ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门
ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门
一、前言
1、本教程主要内容
ASP.NET Core 中间件介绍
通过自定义 ASP.NET Core 中间件实现请求验签
2、本教程环境信息
软件/环境 说明
操作系统 Windows 10
SDK 2.1.401
ASP.NET Core 2.1.3
MySQL 8.0.x
IDE Visual Studio Code 1.32.3
浏览器 Chrome 70
VS Code插件 版本 说明
C# 1.17.1 提供C#智能感知, .NET Core 调试、编译等
vscdoe-solution-explorer 0.3.1 提供解决方案视图
本篇代码以下代码进行调整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-02
3、前置知识
可能需要的前置知识
C# 委托(Delegate)
http://www.runoob.com/csharp/csharp-delegate.html
二、ASP.NET Core 中间件介绍
1、ASP.NET Core 中间件基本说明
当 ASP.NET Core MVC应用从Kestrel接收到请求,会建立HttpContext并交由Application来处理请求。在Application中会有一个处理该请求的通道,这就是ASP.NET Core 管道,通常称之为:请求处理管道
在这个管道中,有一系列有序处理请求的组件,就是中间件(Middleware)。
image
图中蓝色的部分可以认为是系统内置比较靠前的中间件或者我们自定义的中间件,MVC是一个特殊的中间件且通常放在最后,所以这里单独画出来
对于MVC中间件,如果请求的URL与路由匹配,那么后面的中间件均不会生效。所以MVC通常放在最后。
ASP.NET Core中会内置一些中间件,例如:身份验证、静态文件处理、MVC等。每个中间件在接受到请求后都可以选择是交由下一个中间件处理还是直接返回结果。例如:
身份验证中间件验证未通过会直接引导到登陆页
静态文件中间件判断为静态文件就会直接返回静态文件内容
所以,中间件可以理解为请求处理管道中的请求处理器。我们也可以通过自定义中间件注册到管道中来干预请求。
2、ASP.NET Core 中间件基础使用
在程序中,中间件是基于委托来构建的。在应用启动时通过IApplicationBuilder注册到通道中。
具体见启动类Startup.cs:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(routes => { //配置默认路由 routes.MapRoute( name: "Default", template: "{controller}/{action}", defaults: new { controller = "Home", action = "Index" } ); });
}
UseDeveloperExceptionPage、UseMvc都是接口IApplicationBuilder的扩展方法。
三、使用 ASP.NET Core 中间件实现请求验签
如果你开发的API是为手机App服务的,那么你的API是一定要暴露给公网的,如果有人拿到API地址进行非法请求,获取用户信息或者是篡改数据,用户隐私、数据就会受到损害。这是很不安全的,我们可以让客户端请求的时候必须携带签名,在服务器端鉴权(验证签名)通过了再放行,这样就安全很多了。
1、创建验签中间件
在项目Ken.Tutorial.Web创建目录Middlewares,然后创建类:TokenCheckMiddleware.cs
using System;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
namespace Ken.Tutorial.Web.Middlewares
{
public class TokenCheckMiddleware { private readonly RequestDelegate _next; public TokenCheckMiddleware(RequestDelegate requestDelegate) { this._next = requestDelegate; } public Task Invoke(HttpContext context) { //先从Url取token,如果取不到就从Form表单中取token var token = context.Request.Query["token"].ToString() ?? context.Request.Form["token"].ToString(); if (string.IsNullOrWhiteSpace(token)) { //如果没有获取到token信息,那么久返回token missing return context.Response.WriteAsync("token missing"); } //获取前1分钟和当前的分钟 var minute0 = DateTime.Now.AddMinutes(-1).ToString("yyyy-MM-dd HH:mm"); var minute = DateTime.Now.ToString("yyyy-MM-dd HH:mm"); //当token和前一分钟或当前分钟任一时间字符串的MD5哈希一致,就认为是合法请求 if (token == MD5Hash(minute) || token == MD5Hash(minute0)) { return _next.Invoke(context); } //如果token未验证通过返回token error return context.Response.WriteAsync("token error"); } public string MD5Hash(string value) { using (var md5 = MD5.Create()) { var result = md5.ComputeHash(Encoding.ASCII.GetBytes(value)); var strResult = BitConverter.ToString(result); return strResult.Replace("-", ""); } } }
}
由于是侧重自定义中间件,所有验签的逻辑就写的非常简单,如果实际项目使用,可以按照自己需求调整
2、创建扩展方法
在Middlewares目录下新建类:MiddlewareExtension.cs
using Microsoft.AspNetCore.Builder;
namespace Ken.Tutorial.Web.Middlewares
{
public static class MiddlewareExtension { public static IApplicationBuilder UseTokenCheck(this IApplicationBuilder builder) { return builder.UseMiddleware<TokenCheckMiddleware>(); } }
}
这里我们通过扩展方法,将TokenCheckMiddleware挂在接口IApplicationBuilder上
3、中间件注册/引用
在启动类Startup.cs的Configure方法中注册/引用中间件
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//省略部分代码 app.UseTokenCheck(); app.UseMvc(routes => { //省略路由配置代码 });
}
如果你觉得扩展方法有点多余,也可以直接使用UseMiddleware方法注册
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//省略部分代码 app.UseMiddleware<TokenCheckMiddleware>(); app.UseMvc(routes => { //省略路由配置代码 });
}
这里要注意的是,如果你是一个MVC应用,请一定要把MVC这个中间件作为最后一个注册。因为中间件是按照注册顺序被调用的。如果放在MVC之后,请求的URL也有对应路由适配,那么整个请求已经被MVC接管。后面的中间件就不会被调用了。
4、验签中间件测试
启动应用,然后验证不同情况下的访问结果
URL Response
localhost:5001 token missing
localhost:5001?token=test token error
localhost:5001?token=3D76FEA1D0ADD0C7639B73023436C6EA Hello World ! -ken.io
为了方便测试,MD5哈希的值我们可以在线生成:ttp://tool.chinaz.com/tools/md5.aspx
把当前分钟,例如:2019-03-27 23:23 通过MD5在线生成那就是3D76FEA1D0ADD0C7639B73023436C6EA
四、备注
本文代码示例
https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-09
本文参考
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-2.1
延伸阅读
https://www.cnblogs.com/artech/p/inside-asp-net-core-pipeline.html
本文首发于我的独立博客:https://ken.io/note/asp.net-core-tutorial-middleware
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
好程序员web前端培训教程之Node Js流程
好程序员web前端培训学习教程之Node Js流程1,项目前期准备: 以express框架为例 npmiexpress-generator-g//全局安装express框架 express-e//生成express应用骨架 npmi//安装依赖 npmstart//在3000端口监听 拓展:目前最市面上最流行的node框架有: --Sail.js Sails.js就像是Node.js平台上的Rails框架。这是一个可靠可伸缩的开发框架,面向服务的架构,提供数据驱动的API集合。用来开发多玩家游戏、聊天应用和实时面板引用非常方便,也可用于开发企业级Node.js应用。 Sails.js基于Node.js,Connect,Express和Socket.io构建。 --Koa.js koa.js是下一代的Node.js的Web框架。由Express团队设计。旨在提供一个更小型、更富有表现力、更可靠的Web应用和API的开发基础。 Koa可以通过生成器摆脱回调,极大地改进错误处理。Koa核心不绑定任何中间件,但提供了优雅的一组可以快速和愉悦地编写服务器应用的方法。 2...
- 下一篇
spring Cloud之服务治理篇
服务治理介绍 服务治理可以说是微服务中最为核心和基础的模块,主要用来实现各个微服务的自动化注册和发现。 服务注册介绍 在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机和端口号、 版本号、通讯协议等一些附加信息告知注册中心。注册中心按服务名分类组织服务清单。 服务注册中心还需要以心跳的方式去监测清单中的服务是否可用,不可用则从服务清单中剔除,以此达到排除故障服务。 以下示例: 服务发现介绍 服务调用方在调用服务提供方的接口时,并不知道具体的实例服务地址,因此,服务调用方需要向服务注册中心咨询服务。 并获得所有的服务实例清单,以实现对具体服务实例的访问。 Netflix Eureka介绍 spring cloud Eureka使用Netflix Eureka来实现服务注册和发现。Eureka包含了服务端组件同时也包含了客户端组件。 搭建服务注册中心 创建springboot项目 pom.xml引入spring-cloud-*响应的包 <dependency> <groupId>org.springframework.clo...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池