ASP.NET Core MVC+Razor中POST控制器返回400错误请求的问题排查
问题原因及解决办法
核心原因
ASP.NET Core默认启用了跨站请求伪造(CSRF/XSRF)保护,你的AJAX POST请求未携带有效的防伪造令牌,因此服务器返回400 Bad Request。
解决步骤
1. 在视图中生成防伪造令牌
在Add.cshtml视图内添加代码生成令牌:
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Antiforgery @{ var token = Antiforgery.GetAndStoreTokens(Context).RequestToken; }
如果视图内有表单,也可以直接使用@Html.AntiForgeryToken()生成令牌字段,AJAX场景推荐用上述方式直接获取请求令牌。
2. AJAX请求中携带令牌
修改AJAX代码,在请求头中加入防伪造令牌:
$.ajax({ method: "POST", success: console.log, url: "/Cart/Add", headers: { "RequestVerificationToken": "@token" } });
3. 可选:给POST方法显式添加验证特性
虽然MVC控制器POST方法默认会启用CSRF验证,但显式添加特性更清晰:
[HttpPost("Add"), ActionName("Add"), ValidateAntiForgeryToken] public IActionResult PostAdd() { return this.View(); }
额外说明
- 若确实无需CSRF保护(仅建议公开API场景使用),可在目标方法上添加
[IgnoreAntiforgeryToken]特性,或全局禁用,但这会引入安全风险,需谨慎操作。 - 你的Startup配置无问题,
AddControllers()和MapControllers()已正确注册控制器路由,问题根源不在路由配置。
内容的提问来源于stack exchange,提问作者PhoenixXKN
相关产品推荐
相关产品推荐

