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

ASP.NET Core MVC升级到.NET 8后403无法重定向至AccessDenied页面

解决.NET 8集成Windows身份验证下403重定向失效问题

1. 调整中间件顺序(核心解决点)

.NET 8对中间件执行顺序要求严格,UseStatusCodePages必须放在UseRouting之前、UseStaticFiles之后,否则授权返回的403响应会跳过状态码页面中间件。正确的Program.cs代码结构如下:

var builder = WebApplication.CreateBuilder(args);

// 添加MVC服务
builder.Services.AddControllersWithViews();

// 配置集成Windows身份验证
builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme);
builder.Services.AddAuthorization(options =>
{
    // 保留你的角色授权规则
});

var app = builder.Build();

// 环境相关配置
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

// 关键:将状态码处理中间件放在路由之前
app.UseStatusCodePages(async context =>
{
    var response = context.HttpContext.Response;
    if (response.StatusCode == StatusCodes.Status403Forbidden)
    {
        response.Redirect("/Home/AccessDenied");
    }
});

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

2. 确认AccessDenied页面的实现

确保你的HomeController中存在对应的动作方法,且视图文件已创建:

控制器代码:

public class HomeController : Controller
{
    // 其他已有动作...
    public IActionResult AccessDenied()
    {
        return View();
    }
}

视图文件:

在Views/Home目录下创建AccessDenied.cshtml,内容根据需求自定义即可。

3. 更简洁的替代方案

如果不需要自定义逻辑,可以直接使用内置的UseStatusCodePagesWithRedirects方法,一行代码搞定:

// 替换自定义的UseStatusCodePages
app.UseStatusCodePagesWithRedirects("/Home/AccessDenied?statusCode={0}");

这个方法会自动将状态码作为参数传递到页面,你也可以在AccessDenied视图中显示状态码信息。

问题原因说明

.NET Core 3.0及之后版本重构了路由中间件模型,引入了UseRouting和UseEndpoints,中间件执行顺序的优先级变得更高。你之前在.NET Core 2.0中使用的代码没有这些路由中间件,所以顺序影响不大,但在.NET 8中必须严格遵循中间件执行顺序,否则状态码处理逻辑无法捕获授权返回的403响应。

内容的提问来源于stack exchange,提问作者David K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:43:14