.NET 6 API添加[ValidateAntiForgeryToken]时出现服务未注册错误
解决.NET 6 API调用[ValidateAntiForgeryToken]时的500错误
问题根源
[ValidateAntiForgeryToken]特性依赖Microsoft.AspNetCore.Mvc.ViewFeatures模块的服务,而纯API项目默认仅通过AddControllers()注册核心API服务,未包含ViewFeatures相关依赖,导致找不到ValidateAntiforgeryTokenAuthorizationFilter服务。
解决方案
方案一:手动验证(推荐纯API场景)
无需引入额外依赖,通过注入IAntiforgery服务手动验证请求:
- Program.cs中配置Antiforgery服务
builder.Services.AddAntiforgery(options => { options.HeaderName = "X-XSRF-TOKEN"; // 匹配Next.js携带的请求头 options.Cookie.Name = "XSRF-TOKEN"; options.Cookie.SameSite = SameSiteMode.Lax; // 根据跨域场景调整,跨域可设为None options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // HTTPS环境启用 });
- 在控制器中注入并手动验证
using Microsoft.AspNetCore.Antiforgery; [ApiController] [Route("api/[controller]")] public class YourController : ControllerBase { private readonly IAntiforgery _antiforgery; public YourController(IAntiforgery antiforgery) { _antiforgery = antiforgery; } [HttpPost] public async Task<IActionResult> YourAction() { // 验证CSRF令牌 await _antiforgery.ValidateRequestAsync(HttpContext); // 业务逻辑代码 return Ok(); } }
方案二:添加ViewFeatures依赖(不推荐纯API)
如果坚持使用[ValidateAntiForgeryToken]特性,需在Program.cs中注册ViewFeatures服务:
// 替换AddControllers()为AddControllersWithViews(),或单独添加ViewFeatures builder.Services.AddControllers().AddViewFeatures(); // 或者 builder.Services.AddControllersWithViews();
此方案会引入MVC视图相关的不必要依赖,仅适合同时包含MVC视图和API的混合项目。
验证要点
- 确保Next.js请求中正确携带
X-XSRF-TOKEN请求头,值与XSRF-TOKENCookie一致 - 跨域场景下需配置CORS允许携带Cookie和自定义头
内容的提问来源于stack exchange,提问作者Ana Carol
相关产品推荐
相关产品推荐

