ASP.NET Core 6中IdentityServer路由未匹配时返回自定义404页面问题
解决方案:为IdentityServer Razor Pages配置自定义404页面
问题原因
你遇到的InvalidOperationException是因为未指定Identity Area参数——Identity相关的Razor Pages默认属于Identity Area,直接使用/Identity/Error/404作为页面路径会导致框架找不到对应端点,因为它默认会在根Area(空)下查找页面。
正确配置方式
方法1:修正MapFallbackToPage的用法
在IdentityServer的端点配置中,需要明确指定Area为Identity,并使用页面的路由路径(而非物理路径)。假设你的404页面物理路径是/Areas/Identity/Pages/Error/404.cshtml:
appIdentityServer.UseEndpoints(endpoints => { endpoints.MapRazorPages(); // 指定Area为Identity,页面路由路径为/Error/404 endpoints.MapFallbackToPage("/Error/404", new { area = "Identity" }); });
同时确保404.cshtml的@page指令正确:
@page "/Identity/Error/404" @model YourApp.Areas.Identity.Pages.Error.404Model <!-- 页面内容 -->
方法2:使用中间件捕获404并返回自定义页面
如果方法1仍有问题,可以在IdentityServer的中间件分支中添加自定义404捕获逻辑,放在UseEndpoints之前:
appIdentityServer.Use(async (context, next) => { await next(); // 仅处理Identity相关请求的404 if (context.Response.StatusCode == 404 && (context.RequestIsForIdentityServerUi() || context.RequestIsForIdentityServerEndpoint())) { context.Response.StatusCode = 404; // 重定向到自定义404页面 context.Response.Redirect("/Identity/Error/404"); // 若不想重定向,可直接返回页面内容: // var pagePath = Path.Combine(env.ContentRootPath, "Areas/Identity/Pages/Error/404.cshtml"); // var pageContent = await File.ReadAllTextAsync(pagePath); // await context.Response.WriteAsync(pageContent); } }); // 后续的UseRouting、UseAuthentication等配置不变 appIdentityServer.UseRouting(); // ...其他中间件 appIdentityServer.UseEndpoints(endpoints => { endpoints.MapRazorPages(); });
关键注意事项
- 确认Identity Area已正确注册:在
Program.cs中确保已添加Identity Razor Pages的Area支持:services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders() .AddDefaultUI(); // 此方法会自动配置Identity Area的路由 - 避免路由冲突:确保自定义404页面的路由不会与其他Identity端点冲突。
- 测试时清除浏览器缓存:避免旧路由缓存导致的测试异常。
内容的提问来源于stack exchange,提问作者Richard Barraclough
相关产品推荐
相关产品推荐

