поле формы анти-подделки "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;
}