简单的写法:
// 使用匿名函数实现一个内联中间件
app.Run(async (context, next) =>
{
// 做处理
await next.Invoke(); // 调用下一个中间件
// 做处理
});
这种方式只适用于小场景中使用;
目前常用的中间件写法(新建一个类的方式):
// 这个中间件主要是对请求过来的Header中的Token做处理
public class JwtTokenAuth
{
// 中间件一定要有一个next,将管道可以正常的走下去
private readonly RequestDelegate _next;
public JwtTokenAuth(RequestDelegate next)
{
_next = next;
}
public Task Invoke(HttpContext httpContext)
{
//检测是否包含'Authorization'请求头
if (!httpContext.Request.Headers.ContainsKey("Authorization"))
{
return _next(httpContext);
}
var tokenHeader = httpContext.Request.Headers["Authorization"].ToString().Replace("Bearer ", "");
try
{
if (tokenHeader.Length >= 128)
{
TokenModelJwt tm = JwtHelper.SerializeJwt(tokenHeader);
//授权 Claim 关键
var claimList = new List<Claim>();
var claim = new Claim(ClaimTypes.Role, tm.Role);
claimList.Add(claim);
var identity = new ClaimsIdentity(claimList);
var principal = new ClaimsPrincipal(identity);
httpContext.User = principal;
}
}
catch (Exception e)
{
Console.WriteLine($"{DateTime.Now} middleware wrong:{e.Message}");
}
return _next(httpContext);
}
}
// 这里定义一个中间件Helper,主要作用就是给当前模块的中间件取一个别名
public static class MiddlewareHelpers
{
public static IApplicationBuilder UseJwtTokenAuth(this IApplicationBuilder app)
{
return app.UseMiddleware<JwtTokenAuth>();
}
}
使用上面的中间件有两种方式:
app.UseMiddleware<JwtTokenAuth>();
// 或者:
app.UseJwtTokenAuth(); // 这个是通过扩张方法的方式