文档章节

ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门

o
 osc_w9s1w4o0
发布于 2019/03/29 10:18
字数 1407
阅读 5
收藏 0

精选30+云产品,助力企业轻松上云!>>>

一、前言

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

  • C# 扩展方法

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

二、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" } ); }); } 

UseDeveloperExceptionPageUseMvc都是接口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.csConfigure方法中注册/引用中间件

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

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
【目录】ASP.NET Core 2.1 入门教程

<div class="post-content serie-content"> </p><hr>本教程包含且不限于:<br><br><ul><li>使用VS Code开发ASP.NET Core应用</li><li>ASP.NET Core MVC 开发(路由、控制器、视图)</li><li>......

osc_h67eqfa6
2019/07/19
4
0
ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门

原文:ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门 一、前言 1、本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2、本教程环境信息...

osc_cleyftyz
2019/03/29
2
0
.Net Core正式发布了,入门教程大收集

一、官网入门指南 https://aspnet.readthedocs.io/en/latest/getting-started.html 二、国内.Net Core 团队翻译的部分中文入门指南: http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-ind......

一起开源
2016/06/28
1K
0
ASP.NET Core -中间件(Middleware)使用

ASP.NET Core开发,开发并使用中间件(Middleware)。 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件。 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组分在...

osc_ipgs1x3t
2018/05/15
2
0
ASP.NET Core 从入门到精通-资源收集导航

ASP.NET Core 从入门到精通-资源收集导航 [TOC] 学习路线 来自 dotNET匠人 的(中文翻译) ASP.NET Core开发者成长路线图 原英文地址 ASP.NET Core Developer Roadmap 里面包含了 C#、Web、各类...

osc_2w18qc4t
02/03
11
0

没有更多内容

加载失败,请刷新页面

加载更多

Eclipse_JavaEE_Tomcat_MySQL环境配置

安装java环境,配置系统变量(JAVA_HOME,绝对路径) 下载eclipse+Tomcat+mysql window——》preference——》server——》runtime——》tomcat环境 项目右键build path 配mysql jar ,libra...

愿有时光可回首
今天
24
0
MySQL原理 - InnoDB引擎 - 行记录存储 - Redundant行格式

本文基于 MySQL 8 在上一篇:MySQL原理 - InnoDB引擎 - 行记录存储 - Compact格式 中,我们介绍了什么是 InnoDB 行记录存储以及 Compact 行格式,在这一篇中,我们继续介绍其他三种行格式。 ...

zhxhash
今天
29
0
leetcode面试题 17.13(恢复空格)--Java语言实现

求: 哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!"已经变成了"iresetthecomputeritstilldidntboo...

拓拔北海
今天
19
0
B站跨年晚会究竟做对了什么?

燃财经(ID:rancaijing)原创 作者 | 赵磊 编辑 | 周昶帆 “补课”是《bilibili晚会 二零一九最美的夜》这个视频中,观众在前两分钟刷得最多的弹幕,寓意着观众是在元旦之后回来补看跨年晚会...

子乾建建_Jeff
01/07
63
0
关于Scrapy爬虫项目运行和调试的小技巧(上篇)

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 迟日江山丽,春风花草香。泥融飞燕子,沙暖睡鸳鸯。 扫除运行Scrapy爬虫程序...

yuhan336
04/02
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部