Я использую Membership.create
пользовательскую функцию, тогда возникает следующая ошибка:
Отсутствует обязательное поле формы защиты от подделки "__RequestVerificationToken"
Как я могу это исправить?
Я использую Membership.create
пользовательскую функцию, тогда возникает следующая ошибка:
Отсутствует обязательное поле формы защиты от подделки "__RequestVerificationToken"
Как я могу это исправить?
Ответы:
У вас есть [ValidateAntiForgeryToken]
атрибут перед вашим действием. Вы также должны добавить @Html.AntiForgeryToken()
в свою форму.
Html.AntiForgeryToken();
не работает !! Превращение в @Html.AntiForgeryToken()
работы
В моем случае это было в моем web.config:
<httpCookies requireSSL="true" />
Но мой проект был настроен не использовать SSL. Комментирование этой строки или настройка проекта на постоянное использование SSL решила эту проблему.
IIS
была эта привязка ( https » EmptyHostName » IP » 443
), но не было привязки для ( https » www.mysite.com » IP » 443
). Поэтому я добавил новое связывание с непустым именем хоста для , https
который был равен доменом и это решило проблему. У меня тоже есть переписать настройки в IIS
принудительном порядке http 2 https
.
Как это:
[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()
{
..
}
Вы получите сообщение об ошибке, даже если файлы cookie не включены.
Еще одна вещь, которая может вызвать это (только что столкнулась с этим), заключается в следующем: если вы по какой-то причине отключите все поля ввода в своей форме. он отключит скрытое поле ввода, содержащее ваш токен подтверждения. когда форма будет отправлена обратно, значение токена будет отсутствовать и вызовет ошибку, которая отсутствует. поэтому вам нужно снова включить поле ввода, содержащее токен проверки, и все будет в порядке.
Еще одна возможность для тех из нас, кто загружает файлы как часть запроса. Если длина содержимого превышает длину <httpRuntime maxRequestLength="size in kilo bytes" />
и вы используете токены подтверждения запроса, браузер отображает 'The required anti-forgery form field "__RequestVerificationToken" is not present'
сообщение вместо сообщения о превышении длины запроса.
Установка для maxRequestLength значения, достаточно большого для обслуживания запроса, устраняет непосредственную проблему - хотя я признаю, что это неправильное решение (мы хотим, чтобы пользователь знал истинную проблему размера файла, а не проблему отсутствия токенов проверки запроса).
В моем случае у меня был этот javascript в форме submit:
$('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);
});
... и все работало нормально.
readonly
и исключил скрытые элементы управления. Кажется, хорошо работает.
Убедитесь, что в вашем контроллере есть атрибут http, например:
[HttpPost]
также добавьте атрибут в контроллер:
[ValidateAntiForgeryToken]
В вашей форме на ваш взгляд вы должны написать:
@Html.AntiForgeryToken();
У меня был Html.AntiForgeryToken (); без знака @, когда он был в блоке кода, он не выдавал ошибки в Razor, но выдавал во время выполнения. Убедитесь, что вы смотрите на знак @ в @ Html.Ant .., если он отсутствует или нет
В моем случае это было связано с добавлением 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;
}
В моем случае причиной был неправильный домен в web.config для файлов cookie:
<httpCookies domain=".wrong.domain.com" />
Получил эту ошибку в Chrome со входом по умолчанию для ASP.NET с отдельными учетными записями пользователей
.cshtml:
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Use a local account to log in.</h4>
Контроллер:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
Решается очисткой данных сайта для сайта:
В моем решении EPiServer на нескольких контроллерах был атрибут ContentOutputCache в действии Index, которое принимало HttpGet. Каждое представление для этих действий содержало форму, которая отправляла действие HttpPost на тот же или другой контроллер. Как только я удалил этот атрибут из всех этих действий индекса, проблема исчезла.
Потому что это происходит при первом поиске этого:
У меня была эта проблема только в Internet Explorer, и я не мог понять, в чем проблема. Короче говоря, он не сохранял часть маркера cookie, потому что в нашем (под) домене был знак подчеркивания. Работал в Chrome, но IE / Edge не нравился.
Все остальные ответы здесь также действительны, но если ни один из них не решает проблему, также стоит проверить, что фактические заголовки передаются на сервер.
Например, в среде с балансировкой нагрузки за nginx конфигурацией по умолчанию является удаление заголовка __RequestVerificationToken перед передачей запроса на сервер, см .: простой обратный прокси-сервер nginx, похоже, удаляет некоторые заголовки
Иногда вы пишете метод действия формы со списком результатов. В этом случае нельзя работать с одним методом действия. Итак, у вас должно быть два метода действий с одинаковым именем. Одно [HttpGet]
с [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)
{
...
}
public class MyDto { public bool Whatever { get; set; } }
myData
. Если вы это делаете, myData=$('myForm').serialize()
все должно работать нормально.
Я хотел бы поделиться своим, я следил за этим учебником
по борьбе с подделкой, используя 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)
{
....