поле формы анти-подделки "RequestVerificationToken" отсутствует при использовании jQuery Ajax и Html.AntiForgeryToken()
я реализовал эквивалент бритвы для решения, описанного в принятом ответе на этот вопрос:вызовы jQuery Ajax и Html.AntiForgeryToken() Но я продолжал получать следующее исключение:
3 ответов
Ну, после копания еще немного я нашел хорошее решение моей проблемы в этой ссылке: ASP.NET MVC Ajax CSRF защита с jQuery 1.5
насколько я понимаю, решение, описанное в выбранном ответ на этот вопрос: вызовы jQuery Ajax и Html.AntiForgeryToken(), не должно работать (действительно, это не удалось для меня).
создать antiforgerytoken:
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
<input ...>
}
создайте функцию для добавления токена в запрос ajax:
function addRequestVerificationToken(data) {
data.__RequestVerificationToken=$('input[name=__RequestVerificationToken]').val();
return data;
};
вы можете использовать его следующим образом:
$.ajax({
type: "POST",
url: '@Url.Action("MyMethod", "MyController", new {area = "MyArea"})',
dataType: "json",
traditional: true,
data: addRequestVerificationToken( { "id": "12345678" } );
})
.done(function(result) {
if (result) {
// Do something
} else {
// Log or show an error message
}
return false;
});
когда вы называете CallAjax()
, где data
идет? Я спрашиваю, потому что обычно, когда ваши данные поступают из формы, ваш токен CSRF уже является частью формы, как правило, в скрытом поле.
<form action="yourPage.html" method="POST">
<input type="hidden" name="__RequestVerificationToken" value="......"/>
.... other form fields ....
</form>
поэтому, если все ваши данные поступают из формы, вы должны просто убедиться, что маркер является скрытой частью этой формы, и маркер должен автоматически включаться.
если ваши данные поступают откуда-то, кроме формы, то это понятно что вы где-то спрячете свой токен, а затем включите его после того, как данные будут собраны. Но вы можете добавить токен к данным, а не создавать новый объект из токена, а затем добавлять к нему все данные.
if (type == 'POST') {
data._RequestVerificationToken = $("input[name='__RequestVerificationToken']").val();
ajaxOptions.processData = false;
ajaxOptions.contentType = false;
}