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
相关产品推荐
相关产品推荐

