ValidateAntiforgeryToken 不适用于 ASP.NET MVC 中的 Ajax
Posted
技术标签:
【中文标题】ValidateAntiforgeryToken 不适用于 ASP.NET MVC 中的 Ajax【英文标题】:ValidateAntiforgeryToken not working with Ajax in ASP.NET MVC 【发布时间】:2020-05-14 23:27:06 【问题描述】:有这个观点:
@using (html.BeginForm(null, null, FormMethod.Post, new id = "__AjaxAntiForgeryForm" ))
@Html.AntiForgeryToken()
<div id='calendar'></div>
<script src="~/Scripts/Services/Agenda.js" type="text/javascript"></script>
执行以下两行JS代码:
let form = $('#__AjaxAntiForgeryForm');
let token = $('input[name="__RequestVerificationToken"]', form).val();
然后调用这个函数:
function dbUpdate(data, startTime, title)
let evento = JSON.stringify(
'Data': data,
'StartTime': startTime,
'Title': title,
'__RequestVerificationToken': token
);
$.ajax(
type: "POST",
url: 'Agenda/DbUpdate',
data: evento,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response)
console.log("Response");
,
complete: function ()
console.log("After");
,
failure: function (jqXHR, textStatus, errorThrown)
alert("HTTP Status: " + jqXHR.status + "; Error Text: " + jqXHR.responseText); // Display error message
);
- 生成的 Json 示例:
"Data":"2020-0105T03:00:00.000Z",
"StartTime":"8",
"Title":"Sdf",
"__RequestVerificationToken":"IMBfPM4YPyslt_89W6Kfu_Nmy6OW2-8I4n3fp42Figy__2gid3wY8gMC-
glB2o3Y6v6TCEG18nZXRPfLltU2RpOvoy-rMFIyo-uPA2XL4JcFF1aJfXix6RWkTI5l6Ewqhyu5jSQnszEOre2ZP-az3Q2"
控制器是:
[HttpPost]
[AjaxAuthorize]
[ValidateAntiForgeryToken]
public async Task<JsonResult> DbUpdate(AgendaEvent compromisso)
...
return Json("ok");
还有 AgendaEvent 类:
public DateTime Data get; set;
public string StartTime get; set;
public string Title get; set;
public string __RequestVerificationToken get; set;
请注意,如果我在没有 __RequestVerificationToken 的情况下创建课程,则为:
public DateTime Data get; set;
public string StartTime get; set;
public string Title get; set;
我收到错误 404。
但是令牌,即使存在于传递的数据中,也不会被验证。
怎么了?
【问题讨论】:
您收到其他数据了吗?JSON.stringify
将您的数据对象转换为字符串,我认为这不是必需的,只需将对象传递给 AJAX 方法:data: ....
而不是 data: " ... "
另外,您的AgendaEvent
类中不需要__RequestVerificationToken
属性。
@lordvlad30 我已经尝试过不使用它以获得相同的结果...没有任何变化...
您还可以从ajax
参数中删除contentType
和dataType
。 jQuery 会自动检测它们(除非您需要一个非默认值但 JSON 是默认值)。
关于 AgendaEvent 类中的 __RequestVerificationToken 属性,它不存在我收到错误 404...
【参考方案1】:
正如 lordvlad30 所建议的,错误是由于以下行:
let evento = JSON.stringify(
'Data': data,
'StartTime': startTime,
'Title': title,
'__RequestVerificationToken': token
);
具体来说,它不应该有 JSON.stringify() 语句。因此,正确的是:
let evento =
'Data': data,
'StartTime': startTime,
'Title': title,
'__RequestVerificationToken': token
;
一切正常!
【讨论】:
以上是关于ValidateAntiforgeryToken 不适用于 ASP.NET MVC 中的 Ajax的主要内容,如果未能解决你的问题,请参考以下文章
如何全局设置 ValidateAntiForgeryToken
Web API 和 ValidateAntiForgeryToken
ValidateAntiForgeryToken 400 错误使用角度 13 和 ASP.NET 核心 5