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

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

Требуемое поле формы для защиты от подделки "__RequestVerificationToken" является нет

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

Ответ 1

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

Ответ 2

В моем случае у меня было это в моем web.config:

<httpCookies requireSSL="true" />

Но мой проект был настроен не на использование SSL. Комментируя эту строку или настраивая проект, чтобы всегда использовать SSL, он решил.

Ответ 3

Вот так:

Контроллер

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
     ...
     Code Block
     ...
}

Вид:

@using(Html.BeginForm())
{
     @Html.AntiForgeryToken()
     <input name="..." type="text" />
     // rest
}

Ответ 4

Также избегайте использования [ValidateAntiForgeryToken] в разделе [HttpGet].

  [HttpGet]
  public ActionResult MethodName()
  {
  ..
  }

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

[HttpPost]

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

[ValidateAntiForgeryToken]

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

@Html.AntiForgeryToken();

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

Ответ 9

В моем случае у меня был этот 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);
});

... и все работало нормально.

Ответ 10

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

если у вас есть Html.AntiForgeryToken();

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

Ответ 11

В моем случае неправильный домен в web.config для файлов cookie был причиной:

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

Ответ 12

В моем случае это было связано с добавлением 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;
  }

Ответ 13

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

Ответ 14

Потому что это связано с первым поиском этого:

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

Ответ 15

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

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

Ответ 16

Иногда вы пишете метод действия формы со списком результатов. В этом случае вы не можете работать с одним методом действия. Таким образом, у вас должно быть два метода действия с одинаковым именем. Один с [HttpGet] а другой с атрибутом [HttpPost].

В вашем [HttpPost] действия [HttpPost] установите атрибут [ValidateAntiForgeryToken] а также поместите @Html.AntiForgeryToken() в свою HTML-форму.

Ответ 17

В моем случае я получал эту ошибку при создании сообщения 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)
    {
        ...
    }

Ответ 18

Я хотел бы поделиться своим, я следил за этим анти-поддельным учебником используя 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) { ....