You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8 Blazor架构下防伪令牌未生成,需排查缺失配置

Blazor 中 AntiforgeryToken 不生成令牌的解决方案

首先明确:Blazor 架构(Server/WASM)和传统 ASP.NET MVC/Razor Pages 不同,<AntiforgeryToken/> 组件无法直接在 Blazor 组件中生成隐藏字段,需要针对两种架构分别调整实现方式。

Blazor Server 场景

Blazor Server 默认已集成防伪造机制,但如果是用原生 HTML form 直接提交到 API 控制器(而非 Blazor 组件的 C# 方法),需要手动获取并注入令牌:

  1. 在组件中注入 IAntiforgery 服务:
    [Inject]
    private IAntiforgery Antiforgery { get; set; } = default!;
    
  2. 初始化时获取令牌:
    @code {
        private string? _antiforgeryToken;
    
        protected override async Task OnInitializedAsync()
        {
            var tokens = await Antiforgery.GetAndStoreTokensAsync(HttpContext);
            _antiforgeryToken = tokens.RequestToken;
        }
    }
    
  3. 在 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>
    
  4. 可选:在 Program.cs 中自定义防伪造配置(比如指定令牌头或 Cookie 名称):
    builder.Services.AddAntiforgery(options =>
    {
        options.HeaderName = "X-CSRF-TOKEN";
        options.Cookie.Name = ".Blazor.Antiforgery";
    });
    app.UseAntiforgery();
    

Blazor WebAssembly 场景

WASM 是纯客户端架构,无法直接访问服务器端的 HttpContext,需要从服务器端点获取令牌:

  1. 服务器端新增 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 });
        }
    }
    
  2. 客户端组件调用 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; }
        }
    }
    
  3. 如果用 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:17:02