Я использую пользовательскую функцию Membership.create
, тогда возникает следующая ошибка,
Требуемое поле формы для защиты от подделки "__RequestVerificationToken" является нет
Как я могу это исправить?
Я использую пользовательскую функцию Membership.create
, тогда возникает следующая ошибка,
Требуемое поле формы для защиты от подделки "__RequestVerificationToken" является нет
Как я могу это исправить?
У вас есть атрибут [ValidateAntiForgeryToken]
перед действием. Вы также должны добавить @Html.AntiForgeryToken()
в свою форму.
В моем случае у меня было это в моем web.config:
<httpCookies requireSSL="true" />
Но мой проект был настроен не на использование SSL. Комментируя эту строку или настраивая проект, чтобы всегда использовать SSL, он решил.
Вот так:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
Также избегайте использования [ValidateAntiForgeryToken] в разделе [HttpGet].
[HttpGet]
public ActionResult MethodName()
{
..
}
Вы получите сообщение об ошибке, даже если Cookies не включены.
Другая вещь, которая может вызвать это (просто натолкнулась на это), следующая: если вы по какой-то причине отключите все свои поля ввода в своей форме. он отключит скрытое поле ввода, содержащее токен проверки. когда форма будет отправлена обратно, значение токена будет отсутствовать и будет генерировать ошибку, которая отсутствует. поэтому вам нужно снова включить поле ввода, которое содержит токен проверки, и все будет хорошо.
Еще одна возможность для тех из нас, кто загружает файлы в рамках запроса. Если длина содержимого превышает <httpRuntime maxRequestLength="size in kilo bytes"/>
и вы используете токены проверки запроса, браузер отображает сообщение 'The required anti-forgery form field "__RequestVerificationToken" is not present'
вместо запроса длина сообщения превышена.
Установка для maxRequestLength значения, достаточно большого, чтобы удовлетворить запрос, устраняет непосредственную проблему - хотя я признаю, что это не правильное решение (мы хотим, чтобы пользователь знал истинную проблему размера файла, а не проблему отсутствующих маркеров проверки запроса).
Убедитесь, что у вашего контроллера есть свой атрибут http:
[HttpPost]
также добавить атрибут в контроллер:
[ValidateAntiForgeryToken]
В вашей форме на ваш взгляд вы должны написать:
@Html.AntiForgeryToken();
У меня был Html.AntiForgeryToken(); без знака @, когда он был в блоке кода, он не выдавал ошибку в Razor, а выполнял во время выполнения. Убедитесь, что вы смотрите на @знак @Html.Ant.. если он отсутствует или не
В моем случае у меня был этот javascript в форме отправки:
$('form').submit(function () {
$('input').prop('disabled', true);
});
Это удаляло скрытый RequestVerificationToken из отправляемой формы. Я изменил это на:
$('form').submit(function () {
$('input[type=submit]').prop('disabled', true);
$('input[type=text]').prop('readonly', true);
$('input[type=password]').prop('readonly', true);
});
... и все работало нормально.
Если кто-то испытывает ошибку по той же причине, почему я ее испытываю, вот мое решение:
если у вас есть Html.AntiForgeryToken();
измените его на @Html.AntiForgeryToken()
В моем случае неправильный домен в web.config для файлов cookie был причиной:
<httpCookies domain=".wrong.domain.com" />
В моем случае это было связано с добавлением requireSSL=true
к httpcookies
в webconfig, что заставило AntiForgeryToken перестать работать. Пример:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>
Чтобы обе функции requireSSL=true
и @Html.AntiForgeryToken()
работали, я добавил эту строку внутри Application_BeginRequest
в Global.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
В моем решении EPiServer на нескольких контроллерах был атрибут ContentOutputCache для действия индекса, принявшего HttpGet. Каждый вид этих действий содержал форму, которая была отправлена в действие HttpPost одному и тому же контроллеру или другому. Как только я удалил этот атрибут из всех этих указаний, проблема исчезла.
Потому что это связано с первым поиском этого:
У меня была эта проблема только в Internet Explorer и я не мог понять, в чем проблема. Короче говоря, это не спасло часть cookie Token, потому что наш (под) домен имел в ней символ подчеркивания. Работал в Chrome, но IE/Edge не понравилось.
Все остальные ответы здесь также действительны, но если ни один из них не решит проблему, также стоит проверить, что фактические заголовки передаются на сервер.
Например, в среде с балансировкой нагрузки за nginx конфигурация по умолчанию состоит в удалении заголовка __RequestVerificationToken перед передачей запроса на сервер, см.: простой обратный прокси-сервер nginx, кажется, лишает некоторые заголовки
Иногда вы пишете метод действия формы со списком результатов. В этом случае вы не можете работать с одним методом действия. Таким образом, у вас должно быть два метода действия с одинаковым именем. Один с [HttpGet]
а другой с атрибутом [HttpPost]
.
В вашем [HttpPost]
действия [HttpPost]
установите атрибут [ValidateAntiForgeryToken]
а также поместите @Html.AntiForgeryToken()
в свою HTML-форму.
В моем случае я получал эту ошибку при создании сообщения AJAX, оказалось, что значение __RequestVerificationToken не передается в вызове. Мне пришлось вручную найти значение этого поля и установить его как свойство объекта данных, который отправляется в конечную точку.
т.е. data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();
HTML
<form id="myForm">
@Html.AntiForgeryToken()
<!-- other input fields -->
<input type="submit" class="submitButton" value="Submit" />
</form>
Javascript
$(document).on('click', '#myForm .submitButton', function () {
var myData = { ... };
myData.__RequestVerificationToken = $('#myForm input[name="__RequestVerificationToken"]').val();
$.ajax({
type: 'POST',
url: myUrl,
data: myData,
contentType: 'application/x-www-form-urlencoded; charset=utf-8',
dataType: 'json',
success: function (response) {
alert('Form submitted');
},
error: function (e) {
console.error('Error submitting form', e);
alert('Error submitting form');
},
});
return false; //prevent form reload
});
контроллер
[HttpPost]
[Route("myUrl")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> MyUrlAsync(MyDto dto)
{
...
}
Я хотел бы поделиться своим, я следил за этим анти-поддельным учебником
используя asp.net mvc 4 с angularjs, но он генерирует исключение каждый раз, когда я запрашиваю использование $http.post, и я понял, что это просто добавление
X-Requested-With ':' XMLHttpRequest ' в заголовках $http.post, потому что это похоже на (filterContext.HttpContext.Request.IsAjaxRequest())
не распознает его как ajax, и вот мой примерный код.
App.js
var headers = {
'X-Requested-With': 'XMLHttpRequest',
'RequestVerificationToken': $scope.token,
'Content-Type': 'application/json; charset=utf-8;'
};
$http({
method: 'POST',
url: baseURL + 'Save/User',
data: JSON.stringify($scope.formData),
headers: headers
}).then(function (values) {
alert(values.data);
}).catch(function (err) {
console.log(err.data);
});
SaveController
[HttpPost]
[MyValidateAntiForgeryToken]
public ActionResult User(UserModel usermodel)
{
....