.NET 8 Blazor中NotFound与NotAuthorized失效问题求助
.NET 8 Blazor Auto模式下未授权跳转与NotFound页面处理方案
一、修正未授权跳转路径至自定义/login
默认身份验证会跳转到/account/login,需在服务配置中指定自定义登录路径:
在Program.cs中配置Cookie认证选项:
using Microsoft.AspNetCore.Authentication.Cookies; // ... 其他服务配置 ... builder.Services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; }) .AddCookie(options => { options.LoginPath = "/login"; // 替换为你的自定义登录页路由 options.AccessDeniedPath = "/access-denied"; // 可选:权限不足时的跳转路径 }); // 确保添加授权中间件 app.UseAuthentication(); app.UseAuthorization();
二、处理NotFound页面显示问题
要同时解决客户端路由未匹配和服务器端404请求的问题,需分两步配置:
1. 配置NotFound组件路由
在你的NotFound.razor组件顶部添加路由标记:
@page "/not-found"
2. 自定义状态码页面逻辑
替换UseStatusCodePagesWithRedirects为自定义状态码处理,精准区分401和404:
在Program.cs的中间件部分添加:
using Microsoft.AspNetCore.Http; // ... 其他中间件配置 ... app.UseStatusCodePages(async context => { var response = context.HttpContext.Response; if (response.StatusCode == StatusCodes.Status401Unauthorized) { response.Redirect("/login"); } else if (response.StatusCode == StatusCodes.Status404NotFound) { response.Redirect("/not-found"); } });
3. 优化Router的未授权与NotFound逻辑
修改App.razor,将未授权时直接渲染Login组件改为路由跳转(避免URL停留在受保护页面的状态异常),同时确保NotFound组件使用统一布局:
@using HTPB.Client.Pages @using Microsoft.AspNetCore.Components.Authorization @inject NavigationManager NavigationManager <CascadingAuthenticationState> <Router AppAssembly="@typeof(Program).Assembly" AdditionalAssemblies="new[] { typeof(Client._Imports).Assembly }"> <Found Context="routeData"> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(Layout.MainLayout)"> <NotAuthorized> @{ // 跳转到登录页,forceLoad设为false保持Blazor客户端导航 NavigationManager.NavigateTo("/login", forceLoad: false); } </NotAuthorized> </AuthorizeRouteView> </Found> <NotFound> <Layout.MainLayout> <NotFound></NotFound> </Layout.MainLayout> </NotFound> </Router> </CascadingAuthenticationState>
三、Auto模式注意事项
- 确保
AdditionalAssemblies正确包含客户端程序集,保证服务器端渲染时能找到客户端组件 - WebAssembly交互模式下,客户端路由优先处理,服务器端仅处理初始请求和API请求,状态码处理主要覆盖服务器端返回的404/401场景
内容的提问来源于stack exchange,提问作者Lazar Nikolić
相关产品推荐
相关产品推荐

