.NET 8 Blazor架构下防伪令牌未生成,需排查缺失配置
Blazor 中 AntiforgeryToken 不生成令牌的解决方案
首先明确:Blazor 架构(Server/WASM)和传统 ASP.NET MVC/Razor Pages 不同,<AntiforgeryToken/> 组件无法直接在 Blazor 组件中生成隐藏字段,需要针对两种架构分别调整实现方式。
Blazor Server 场景
Blazor Server 默认已集成防伪造机制,但如果是用原生 HTML form 直接提交到 API 控制器(而非 Blazor 组件的 C# 方法),需要手动获取并注入令牌:
- 在组件中注入
IAntiforgery服务:[Inject] private IAntiforgery Antiforgery { get; set; } = default!; - 初始化时获取令牌:
@code { private string? _antiforgeryToken; protected override async Task OnInitializedAsync() { var tokens = await Antiforgery.GetAndStoreTokensAsync(HttpContext); _antiforgeryToken = tokens.RequestToken; } } - 在 form 中手动添加隐藏字段:
<form method="post" action="/api/yourcontroller" @onsubmit="UpdateInputs"> <input type="hidden" name="__RequestVerificationToken" value="@_antiforgeryToken" /> <button type="submit" class="btn btn-sm btn-primary" data-bs-dismiss="modal">Ok</button> <button type="button" class="btn btn-sm btn-primary" data-bs-dismiss="modal" @onclick="clear">Cancel</button> </form> - 可选:在 Program.cs 中自定义防伪造配置(比如指定令牌头或 Cookie 名称):
builder.Services.AddAntiforgery(options => { options.HeaderName = "X-CSRF-TOKEN"; options.Cookie.Name = ".Blazor.Antiforgery"; }); app.UseAntiforgery();
Blazor WebAssembly 场景
WASM 是纯客户端架构,无法直接访问服务器端的 HttpContext,需要从服务器端点获取令牌:
- 服务器端新增 API 控制器提供令牌:
[ApiController] [Route("api/antiforgery")] public class AntiforgeryController : ControllerBase { private readonly IAntiforgery _antiforgery; public AntiforgeryController(IAntiforgery antiforgery) { _antiforgery = antiforgery; } [HttpGet] public IActionResult GetToken() { var tokens = _antiforgery.GetAndStoreTokens(HttpContext); return Ok(new { RequestToken = tokens.RequestToken }); } } - 客户端组件调用 API 获取令牌并添加到表单:
@inject HttpClient Http <form method="post" action="/api/yourcontroller" @onsubmit="UpdateInputs"> <input type="hidden" name="__RequestVerificationToken" value="@_antiforgeryToken" /> <button type="submit" class="btn btn-sm btn-primary" data-bs-dismiss="modal">Ok</button> <button type="button" class="btn btn-sm btn-primary" data-bs-dismiss="modal" @onclick="clear">Cancel</button> </form> @code { private string? _antiforgeryToken; protected override async Task OnInitializedAsync() { var tokenResponse = await Http.GetFromJsonAsync<AntiforgeryTokenResponse>("api/antiforgery"); _antiforgeryToken = tokenResponse?.RequestToken; } private class AntiforgeryTokenResponse { public string? RequestToken { get; set; } } } - 如果用 HttpClient 提交请求(而非原生 form),需在请求头中携带令牌:
var request = new HttpRequestMessage(HttpMethod.Post, "/api/yourcontroller"); request.Headers.Add("X-CSRF-TOKEN", _antiforgeryToken); // 添加请求体内容 var response = await Http.SendAsync(request);
通用注意事项
- 放弃使用
<AntiforgeryToken/>组件:该组件仅适用于 ASP.NET MVC/Razor Pages,Blazor 不支持直接渲染。 - 全局验证配置:可以在 Program.cs 中全局添加防伪造过滤器,避免逐个控制器添加
[ValidateAntiForgeryToken]:builder.Services.AddControllers(options => { options.Filters.Add(new ValidateAntiForgeryTokenAttribute()); }); - 验证 Cookie:通过浏览器开发者工具的「Application」标签,检查是否存在对应的防伪造 Cookie,确认服务器端配置生效。
内容的提问来源于stack exchange,提问作者Meena
相关产品推荐
相关产品推荐

