asp.net core 自定义中间件
自定义中间件比较简单,分两步,构造函数与执行函数
- 首先中间件内部需要定义一个 RequestDelegate 的属性,表示下一个要执行的中间件;构造函数里面需要有一个RequestDelegate 参数,接收下一个中间件,另外需要其他注入的服务自己可以随意加
- 要有一个Invoke方法,用于执行,返回值需要是Task,参数需要HttpContext
比如一个权限中间件 定义:
首先定义构造函数:
//下一个要执行的中间件
private RequestDelegate _next;
//构造函数注入的方式,在IOC容器中获取服务
private IConfiguration _configuration;
//如果需要其他服务,可以自己加
public AuthorizationMiddleware(RequestDelegate next, IConfiguration configuration)
{
_next = next;
_configuration = configuration;
}
然后Invoke执行函数:
public Task Invoke(HttpContext context)
{
//swagger都通过,不需要权限验证
if (context.Request.Path.Value.StartsWith("/swagger"))
{
return _next?.Invoke(context);
}
if (context.Request.Headers.ContainsKey("loginWord"))
{
string data = context.Request.Headers["loginWord"][0];
if (!_logins.Contains(data))
{
//通过设置Response的StatusCode 与 Response.WriteAsync输出内容,结束这次请求
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
context.Response.WriteAsync("未授权");
}
else
{
//顺利通过,进入下一个中间件
return _next?.Invoke(context);
}
}
else
{
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
context.Response.WriteAsync("未授权,请添加loginWord验证");
}
return Task.CompletedTask;
}
最后可以写一个扩展方法,与其他中间价保持一致
public static class AuthorizationMiddlewareExtensions
{
/// <summary>
/// 使用自定义的鉴权中间件
/// </summary>
/// <param name="app"></param>
/// <returns></returns>
public static IApplicationBuilder UseCustomAuthorization(this IApplicationBuilder app)
{
//这样在startup.configure方法中直接用app.UseCustomAuthorization();就可以了
//如果不写这个扩展方法就把下面这句直接放在startup.configure方法中就可以了
return app.UseMiddleware<AuthorizationMiddleware>();
}
}