You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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;
}

解决方案

问题根源有两点:

  1. 设置403状态码后仍调用await _next(context),后续中间件可能修改响应状态或让请求继续流转,导致UseStatusCodePagesWithReExecute无法正确捕获状态码。
  2. 手动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:01:09