ASP.NET MVC使用ASP.NET Identity时jQuery Ajax报parse error问题求助
问题原因
你缺失的是ASP.NET MVC内置的AntiForgeryToken(跨站请求伪造防伪令牌)。默认情况下ASP.NET Identity相关的控制器都会全局或针对POST接口添加[ValidateAntiForgeryToken]校验特性,请求未携带合法令牌时会直接返回401状态码,不会进入你的Register业务方法,和你遇到的现象完全匹配。
解决方案
方案1(推荐,保留安全校验)
- 在发起请求的Razor视图中添加令牌生成代码,会自动渲染一个隐藏的令牌输入框:
@Html.AntiForgeryToken()
- 修改Ajax请求代码,在请求头中携带防伪令牌:
// 先获取页面生成的防伪令牌 const csrfToken = $('input[name="__RequestVerificationToken"]').val(); $.ajax({ type: "POST", url: '/Account/Register', data: JSON.stringify(data), contentType: "application/json; charset=utf-8", dataType: "json", // 添加请求头携带令牌 headers: { "__RequestVerificationToken": csrfToken }, success: function (response) { console.log(response) }, error: function (response) { console.log(response) } });
- 修正后端Action的参数绑定规则,因为你提交的是JSON格式数据,需要给参数加
[FromBody]标记才能正确接收:
[HttpPost] public async Task<JsonResult> Register([FromBody] string data) { // 原有业务逻辑不变 }
方案2(不推荐,仅临时调试用)
如果不需要做CSRF校验,可以直接在Register Action上添加[IgnoreAntiforgeryToken]特性,跳过令牌校验,无需修改前端代码:
[HttpPost] [IgnoreAntiforgeryToken] public async Task<JsonResult> Register(string data) { // 原有业务逻辑不变 }
注意:该方案会存在CSRF攻击风险,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者AhSoHard
相关产品推荐
相关产品推荐

