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
相关产品推荐
相关产品推荐

