ASP.NET Core Identity干扰StatusCodePages 404中间件问题求解
我正在使用ASP.NET Core Razor Pages 7并集成Identity组件。当访问不存在的页面(如/non-existent-page)时,期望直接显示404页面,但实际会先重定向到登录页/login/?return=%2Fnon-existent-page,登录完成后才会跳转到404页面。
我的配置信息:
- 启动配置中设置了授权回退策略:
services.AddAuthorization(x => { x.FallbackPolicy = x.DefaultPolicy; }); - 已配置状态码中间件并放在靠前位置:
app.UseStatusCodePagesWithReExecute("/error", "?statusCode={0}") - 中间件顺序:异常处理程序 → 状态码 → 静态文件 → 路由 → 身份验证 → 授权 → Razor Pages → 控制器
- 错误页面已添加
[AllowAnonymous]特性 - 错误页PageModel包含方法:
public void OnGet(int statusCode) { }
问题根源在于设置的授权回退策略会对所有未明确配置授权规则的请求(包括不存在的页面请求)强制要求身份验证。当请求一个不存在的页面时,路由中间件找不到匹配的端点,授权回退策略会触发身份验证跳转,而非让状态码中间件直接处理404。
修复步骤如下:
调整授权回退策略的作用范围
不要直接将回退策略设为默认策略,而是创建仅针对有效端点(存在的Razor Pages/控制器)的授权策略,避免影响未匹配到端点的请求。修改AddAuthorization配置:services.AddAuthorization(options => { options.FallbackPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .AddRequirements(new DenyAnonymousAuthorizationRequirement()) .Build(); });该策略仅对带有端点元数据的请求生效,不会拦截未匹配到任何页面/接口的请求。
确保状态码中间件优先处理404
保持现有中间件顺序不变,调整授权策略后,未匹配端点的请求会直接进入状态码中间件,触发404错误页的重执行,不会触发身份验证跳转。验证错误页匿名访问配置
确认错误页的[AllowAnonymous]特性未被其他配置覆盖,确保错误页本身不需要登录即可访问(你的现有配置已满足此要求)。可选:添加路由回退端点
在路由配置末尾添加回退端点,直接处理所有未匹配的请求,更早返回404:app.MapRazorPages(); app.MapControllers(); // 回退路由需放在所有路由配置之后 app.MapFallback(async context => { context.Response.StatusCode = StatusCodes.Status404NotFound; await context.Response.Redirect($"/error?statusCode={StatusCodes.Status404NotFound}"); });
调整完成后,访问不存在的页面时会直接触发404错误页,不再跳转到登录页面。
内容的提问来源于stack exchange,提问作者lonix

