授权中间件未拦截请求:自定义API鉴权中间件执行异常排查
问题原因与解决方案
你遇到的问题核心很明确:你的中间件最后调用了return _next(httpContext);,这会让请求继续沿着中间件管道向下传递,最终还是会触发你的API方法——哪怕你已经设置了401状态码,管道的后续流程并不会自动终止。
修正后的中间件代码
只需要去掉对_next的调用,直接返回一个已完成的任务,就能终止整个请求管道,阻止API方法执行:
// 先设置响应内容类型,确保客户端能正确解析返回信息 httpContext.Response.ContentType = "text/plain"; httpContext.Response.StatusCode = 401; // 等待写入操作完成,避免异步写入的潜在问题 await httpContext.Response.WriteAsync("Invalid username or password."); // 直接返回完成任务,终止管道,不再执行后续的中间件和API方法 return Task.CompletedTask;
额外补充
如果是在ASP.NET Core 3.0及以上版本中,也可以用httpContext.Abort()直接终止请求,但上面的方式更直观且兼容性更好。另外,务必用await等待WriteAsync执行完成,否则可能出现响应内容未完全写入就中断请求的情况。
内容的提问来源于stack exchange,提问作者LittleDragon
相关产品推荐
相关产品推荐

