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

ASP.NET Core 8 Web API:未注册ValidateAntiforgeryTokenAuthorizationFilter服务

ASP.NET Core 8 Web API AntiForgery令牌异常解决

问题根源:Web API模板默认仅注册API相关服务,未包含MVC视图依赖的ViewFeatures组件,而你使用的[ValidateAntiForgeryToken]属性恰好依赖该组件中的ValidateAntiforgeryTokenAuthorizationFilter,因此运行时会抛出服务未注册的异常。

直接按以下步骤修复即可:

1. 补全依赖服务(若坚持使用原属性)

在Program.cs中,注册Controllers时需添加ViewFeatures支持,同时配置AntiForgery服务适配API场景:

builder.Services.AddControllers()
    .AddViewFeatures(); // 补充ViewFeatures组件,解决过滤器服务找不到的问题

// 配置AntiForgery参数,适配API的令牌传递方式
builder.Services.AddAntiforgery(options =>
{
    options.HeaderName = "X-XSRF-TOKEN"; // 指定客户端传递令牌的请求头名称
    options.Cookie.Name = "XSRF-TOKEN"; // 存储令牌的Cookie名称
});

2. 更推荐:使用API专用验证属性

Web API有专门的AntiForgery验证属性[ApiValidateAntiForgeryToken],无需依赖ViewFeatures组件,直接替换原属性即可:

using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class YourController : ControllerBase
{
    [HttpPost]
    [ApiValidateAntiForgeryToken] // 替换为API专用验证属性
    public IActionResult YourAction([FromBody] YourModel model)
    {
        return Ok("处理成功");
    }
}

3. 全局启用验证的正确姿势

若你之前尝试添加全局过滤器,需确保注册的是API专用的过滤器,而非MVC版本:

builder.Services.AddControllers(options =>
{
    // 全局注册API专用的AntiForgery验证过滤器
    options.Filters.Add(new ApiValidateAntiForgeryTokenAttribute());
});
// 使用此方式无需额外添加AddViewFeatures()

客户端令牌传递说明

API场景下,客户端需先从服务器获取令牌,可新增一个接口提供令牌:

[HttpGet("get-xsrf-token")]
public IActionResult GetXsrfToken()
{
    var antiforgery = HttpContext.RequestServices.GetRequiredService<IAntiforgery>();
    var tokens = antiforgery.GetAndStoreTokens(HttpContext);
    return Ok(new { Token = tokens.RequestToken });
}

后续发送POST/PUT等请求时,将拿到的令牌放入X-XSRF-TOKEN请求头中即可完成验证。


内容的提问来源于stack exchange,提问作者Dev 404

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:47:06