Blazor 8 Web App:使[Authorize] API端点返回403而非登录页
解决Blazor 8 API端点未认证返回登录页问题
核心问题是Blazor默认的Cookie认证会对所有未认证请求重定向到登录页,包括API请求。我们需要通过修改认证事件,区分API路径和Blazor页面路径,分别处理未认证请求。
步骤1:修改Cookie认证事件配置
在Program.cs的服务注册部分,为Cookie认证添加路径判断逻辑,当请求路径以/api开头时,返回401/403状态码而非重定向:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { // Blazor页面的登录跳转配置 options.LoginPath = "/login"; options.AccessDeniedPath = "/access-denied"; // 处理未认证的API请求:返回401 options.Events.OnRedirectToLogin = context => { if (context.Request.Path.StartsWithSegments("/api")) { context.Response.StatusCode = StatusCodes.Status401Unauthorized; return Task.CompletedTask; } context.Response.Redirect(context.RedirectUri); return Task.CompletedTask; }; // 处理权限不足的API请求:返回403 options.Events.OnRedirectToAccessDenied = context => { if (context.Request.Path.StartsWithSegments("/api")) { context.Response.StatusCode = StatusCodes.Status403Forbidden; return Task.CompletedTask; } context.Response.Redirect(context.RedirectUri); return Task.CompletedTask; }; });
步骤2:确保路由顺序正确
在Program.cs中,先映射API端点,再映射Blazor路由,保证API请求不会被Blazor路由捕获:
var app = builder.Build(); // ...其他中间件(如静态文件、HTTPS重定向等) app.UseAuthentication(); app.UseAuthorization(); // 先映射API app.MapSampleApi(); // 再映射Blazor组件路由 app.MapRazorComponents<App>() .AddInteractiveServerRenderMode() .AddInteractiveWebAssemblyRenderMode() .AddAdditionalAssemblies(typeof(Client._Imports).Assembly); app.Run();
验证效果
- 未认证访问Blazor页面(如
/dashboard):仍会重定向到登录页,符合预期。 - 未认证访问API端点
/api/auth:返回401状态码;如果用户已登录但无权限,返回403状态码。 - 正常访问
/api/hello:返回"Hello World"文本。
这样就实现了Blazor页面保持登录跳转,API端点返回标准HTTP状态码的需求。
内容的提问来源于stack exchange,提问作者pingu2k4
相关产品推荐
相关产品推荐

