В требуемом поле формы защиты от подделки "RequestVerificationToken" нет ошибки при регистрации пользователя

Я использую Membership.create пользовательская функция, затем возникает следующая ошибка,

требуемое поле формы защиты от подделки "_ _ RequestVerificationToken" нет

Как я могу это исправить?

15 ответов


вы [ValidateAntiForgeryToken] атрибут перед вашим действием. Вы также должны добавить @Html.AntiForgeryToken() в вашей форме.


в моем случае у меня это было в моей сети.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()
  {
  ..
  }

вы получите сообщение об ошибке, даже если куки не включены.


еще одна вещь, которая может вызвать это (просто столкнулся с этим), это следующее: если вы по какой-то причине отключить все поля ввода в форме. он отключит скрытое поле ввода, содержащее маркер проверки. когда форма будет разнесена обратно, значение токена будет отсутствовать и создаст ошибку, которая отсутствует. поэтому вам нужно снова включить поле ввода, содержащее токен проверки, и все будет хорошо.


еще одна возможность для тех из нас, кто загружает файлы в рамках запроса. Если длина содержимого превышает <httpRuntime maxRequestLength="size in kilo bytes" /> и вы используете токены проверки запроса, браузер отображает 'The required anti-forgery form field "__RequestVerificationToken" is not present' message вместо длины запроса превышено сообщение.

установка maxRequestLength в значение, достаточно большое, чтобы удовлетворить запрос лечит непосредственную проблему - хотя я признаю, что это не правильное решение (мы хотим, чтобы пользователь знал истинную проблему размера файла, не то, что токены проверки запроса отсутствуют).


убедитесь, что в вашем контроллере у вас есть атрибут http, например:

[HttpPost]

также добавьте атрибут в контроллер:

[ValidateAntiForgeryToken]

в вашей форме на вашем представлении вы должны написать:

@Html.AntiForgeryToken();

У меня был Html.AntiForgeryToken (); без знака@, пока он был в блоке кода, он не дал ошибку в Razor, но сделал во время выполнения. убедитесь, что вы смотрите на @ знак @Html.Муравей.. если он отсутствует или нет


в моем случае у меня был этот javascript в форме submit:

$('form').submit(function () {
    $('input').prop('disabled', true);
});

это удаление скрытого RequestVerificationToken из отправляемой формы. Я изменил это:

$('form').submit(function () {
    $('input[type=submit]').prop('readonly', true);
    $('input[type=text]').prop('readonly', true);
    $('input[type=password]').prop('readonly', true);
});

... и это сработало отлично.


Если кто-то испытывает ошибку по той же причине, почему я ее испытываю, вот мое решение:

если бы у вас был Html.AntiForgeryToken();

изменить на @Html.AntiForgeryToken()


в моем случае неверный домен в web.конфиг для cookies был причиной:

<httpCookies domain=".wrong.domain.com" />

в моем решении EPiServer на нескольких контроллерах был атрибут ContentOutputCache в действии индекса, который принял HttpGet. Каждое представление для этих действий содержало форму, которая отправляла действие HttpPost на тот же контроллер или на другой. Как только я удалил этот атрибут из всех этих действий индекса, проблема исчезла.


потому что это приходит с первым поиском этого:

У меня была эта проблема только в Internet Explorer и не мог понять, в чем проблема. Короче говоря, он не сохранял часть cookie токена, потому что в нашем (суб)домене было подчеркивание. Работал в Chrome, но IE / Edge это не понравилось.


все остальные ответы здесь также действительны, но если ни один из них не решает проблему, также стоит проверить, что фактические заголовки передаются на сервер.

например, в среде с балансировкой нагрузки за nginx конфигурация по умолчанию -удалите заголовок _ _ RequestVerificationToken перед передачей запроса на сервер см.:простой обратный прокси-сервер nginx, похоже, удаляет некоторые заголовки


Я хотел бы поделиться своим, я следил за этим анти-forgerytoken учебник использование asp.net mvc 4 с angularjs, но он выдает исключение каждый раз, когда я запрашиваю с помощью $http.post и я понял, что решение просто добавить 'X-Requested-With':'XMLHttpRequest' к заголовкам $http.сообщение, потому что это похоже на (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) { ....