.NET Core自定义中间件:如何返回403禁止错误并跳转至错误控制器
ASP.NET Core自定义中间件403状态码无法触发错误页跳转问题
我已经实现了自定义身份验证和授权处理程序,现在需要一个自定义中间件在特定场景下做额外检查。当前项目中配置的异常和状态码处理代码如下:
app.UseExceptionHandler("/Error/{0}"); app.UseHsts(); } app.UseStatusCodePagesWithReExecute("/Error/{0}");
我的自定义中间件测试代码如下,希望在满足某些条件时终止中间件流程并跳转到错误控制器,但当前代码无法正常触发跳转。用response.Redirect()虽然能跳转,但会陷入无限循环。我考虑过返回Forbid()或StatusCodeResult(403),但中间件的Invoke方法返回类型是Task,不知道怎么处理。
public async Task Invoke(HttpContext context) { context.Response.StatusCode = 403; await _next(context); return; }
解决方案
问题根源有两点:
- 设置403状态码后仍调用
await _next(context),后续中间件可能修改响应状态或让请求继续流转,导致UseStatusCodePagesWithReExecute无法正确捕获状态码。 - 手动
Redirect会让错误页请求再次被自定义中间件拦截,触发重复跳转,形成无限循环。
修改中间件Invoke方法,满足拦截条件时设置状态码后终止后续中间件执行即可:
public async Task Invoke(HttpContext context) { // 替换为你的实际检查逻辑 bool shouldBlock = true; if (shouldBlock) { // 清除响应内容避免干扰 context.Response.Clear(); // 设置403状态码 context.Response.StatusCode = StatusCodes.Status403Forbidden; // 直接返回,不执行后续中间件,交给StatusCodePages处理跳转 return; } // 检查通过,继续执行后续流程 await _next(context); }
修改后,UseStatusCodePagesWithReExecute会捕获403状态码,自动跳转到/Error/403路径。如果需要避免错误页被拦截,可在检查逻辑中加入路径判断:if (context.Request.Path.StartsWithSegments("/Error")),跳过对错误页的检查。
另外,也可以使用ASP.NET Core内置的ForbidAsync方法,更贴合授权逻辑:
public async Task Invoke(HttpContext context) { bool shouldBlock = true; if (shouldBlock) { await context.ForbidAsync(); return; } await _next(context); }
ForbidAsync会自动设置403状态码并终止流程,同样能被UseStatusCodePagesWithReExecute捕获并触发错误页跳转。
内容的提问来源于stack exchange,提问作者Rajeev Menon
相关产品推荐
相关产品推荐

