Я смотрел примеры того, как это сделать на SO, и насколько я могу судить, я пробовал все примеры, которые я могу найти без успеха до сих пор. Я попытался изменить некоторые из реализаций моего сценария, но пока это не удалось.
У меня есть это на моей странице в _layout.cshtml, поэтому у меня всегда есть доступный токен:
<form id="__AjaxAntiForgeryForm" action="#" method="post"> @Html.AntiForgeryToken()</form>
У меня также есть этот метод в моем файле JavaScript utils:
AddAntiForgeryToken = function (data) {
data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
return data;
};
Это все работает как ожидалось, и я получаю токен анти-подделки. Мой фактический код проводки:
myPage.saveData = function() {
var saveUrl = '/exercises/PostData';
var myData = JSON.stringify(myPage.contextsArrays);
$.ajax({
type: 'POST',
async: false,
url: saveUrl,
data: AddAntiForgeryToken({ myResults: myData }),
success: function () {
alert('saved');
},
dataType: 'json',
contentType: "application/json; charset=utf-8"
});
};
Мой метод действий выглядит следующим образом:
[HttpPost, ValidateAntiForgeryToken, JsonExceptionFilter]
public JsonResult PostData(List<ResultsDc> myResults)
{
return Json(_apiClient.SubmitResults(myResults));
}
Я тестировал это с различными реализациями, которые я пытался, и ответ всегда:
{"errorMessage":"The required anti-forgery form field \"__RequestVerificationToken\" is not present."}
Я не размещаю форму, а просто массив данных, но проверяя данные, которые фактически отправляются Json, не выглядит правильно (все кодируется), но имя параметра __RequestVerificationToken присутствует и значение токена также присутствует.
В настоящий момент я довольно смущен всем этим и не могу найти правильный способ отправить токен, чтобы вызвать действие MVC. Если я удалю атрибут ValidateAntiForgeryToken
и у вас JSON.stringify(myPage.contextsArrays);
как данные, json выглядит корректно (unencoded) и он отлично отображает.
Как получить этот токен, размещенный правильно без формы?