.NET 9 Blazor Server交互式应用登录防伪造令牌报错求助
解决方案
1. 修正中间件顺序(核心修复)
你的app.UseAntiforgery()位置错误,Blazor Server交互式模式下,防伪造中间件必须在映射Razor组件之前配置,否则无法正确识别端点级的防伪造元数据调整。修改Program.cs的代码顺序:
app.UseAuthentication(); app.UseAuthorization(); // 先配置防伪造中间件,再映射Blazor组件 app.UseAntiforgery(); app.MapRazorComponents<App>() .AddInteractiveServerRenderMode();
2. 针对登录/注册页面禁用防伪造检查
方法A:全局端点配置
在映射Blazor组件时,通过WithAntiforgeryMetadata为指定路径关闭防伪造验证:
app.MapRazorComponents<App>() .AddInteractiveServerRenderMode() .WithAntiforgeryMetadata(endpoint => { var routePath = endpoint.RoutePattern.RawText; return !string.Equals(routePath, "/login", StringComparison.OrdinalIgnoreCase) && !string.Equals(routePath, "/register", StringComparison.OrdinalIgnoreCase); });
方法B:确保组件级属性生效
如果坚持使用组件级配置,确认Login.razor中的@attribute [IgnoreAntiforgeryToken]放置正确,同时保证中间件顺序符合上述要求即可。
3. 移除无效的自定义中间件
你之前添加的路径拦截中间件对Blazor Server交互式模式无效(防伪造验证在端点处理阶段执行,而非普通中间件管道),请删除这段代码:
// 移除该段无效代码 app.Use(async (context, next) => { if (context.Request.Path.StartsWithSegments("/login") || context.Request.Path.StartsWithSegments("/register")) { context.Features.Set<Microsoft.AspNetCore.Antiforgery.IAntiforgeryValidationFeature>(null!); } await next(); });
问题根源说明
app.UseAntiforgery()放在MapRazorComponents之后,导致中间件无法读取你设置的[IgnoreAntiforgeryToken]元数据。- Blazor Server交互式模式下,EditForm提交通过SignalR回路处理,而非传统HTTP POST,普通路径拦截逻辑无法绕过防伪造检查。
- 移除
app.UseAntiforgery()会触发错误,因为Blazor默认端点(如根路径/)已包含防伪造元数据,必须有对应中间件支持。
内容的提问来源于stack exchange,提问作者Beetlejuice
相关产品推荐
相关产品推荐

