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


146

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

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

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

Ответы:


225

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


11
У меня есть веб-страница с той же проблемой, но все в порядке. в чем ошибка.
ConductedClever

@ConductedClever Вам следует внимательно проверить все (поля, файлы cookie) с помощью fiddler и / или firebug (любых инструментов для разработчиков в браузере), посмотрите эту статью: asp.net/web-api/overview/security/…
webdeveloper

@Conducted, меня тоже. Это работа, но эта ошибка возникает редко, и я понятия не имею, ПОЧЕМУ?
QMaster

У меня все в порядке, в моих тестах работает, на клиентской машине до недавнего времени работало, но теперь выдает эту ошибку. Понятия не имею почему. Есть ли у кого-нибудь другие идеи, кроме перечисленных здесь, пожалуйста?
Андрей Добрин

1
Html.AntiForgeryToken();не работает !! Превращение в @Html.AntiForgeryToken()работы
FindOutIslamNow

81

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

<httpCookies requireSSL="true" />

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


3
В моем случае в web.config был requireSSL, но были привязки IIS как для порта 80, так и для порта 443, поэтому пользователи, набирающие https, получали правильное поведение, а пользователи, вводящие http, получали эту ошибку, добавляя правило перезаписи, чтобы заставить всех использовать https: / / {HTTP_HOST} / {R: 1} исправил
ошибку

Спасибо 😃 В моем случае IISбыла эта привязка ( https » EmptyHostName » IP » 443), но не было привязки для ( https » www.mysite.com » IP » 443). Поэтому я добавил новое связывание с непустым именем хоста для , httpsкоторый был равен доменом и это решило проблему. У меня тоже есть переписать настройки в IISпринудительном порядке http 2 https.
RAM

64

Как это:

Контроллер

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

Вид:

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

Попробуйте использовать только в HTML
Субрата Саркар

41

Также убедитесь, что не используйте [ValidateAntiForgeryToken] под [HttpGet].

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

1
Этот ответ дополнил другие и решил мою проблему! Спасибо
Лукас

1
В этом ответе предполагается, что вы не сохраняете никаких отправленных данных (которых не должно быть в HttpGet). Если да, то вам по-прежнему нужна защита XSRF, которую обеспечивает [ValidateAntiForgeryToken].
thelem 03

9

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


2
Хороший хит. Я использовал Internet Explorer. Использование браузера Chrome решило проблему для меня
FindOutIslamNow 01

Это тоже решило мою проблему. включение файлов cookie в Google Chrome. Спасибо
Научный метод

7

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


7

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

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


6

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

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


Как вы заметили, что антиклавиша влияет при отключении ввода?
Cer

1
@Cer - если вы спрашиваете, как я заметил, я проверил запрос со скрипачом и понял, что ключ не отправляется. Я читал, что отправленные HTML-файлы не будут включать отключенные элементы управления. Поэтому я изменил его на readonlyи исключил скрытые элементы управления. Кажется, хорошо работает.
Шон

5

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

[HttpPost]

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

[ValidateAntiForgeryToken]

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

@Html.AntiForgeryToken();

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


3

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

если у тебя есть Html.AntiForgeryToken();

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


3

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

2

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

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

да! если вы на локальном компьютере введите <httpCookies domain = "localhost" />, то файлы cookie будут работать только на локальном компьютере, и если вы попытаетесь открыть свой сайт на другом компьютере, вы введете его IP-адрес (например, 192.168.1.43), который не будет работать, потому что он ищет "localhost"
user3419036

2

Получил эту ошибку в 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)

Решается очисткой данных сайта для сайта:

введите описание изображения здесь


Хорошо, это сработало. Но это происходит снова и снова. В Firefox тот же проект работает правильно. Что я могу сделать?
Кан Юрек,

@ CanÜrek У вас есть несколько разных проектов / сайтов с одним доменом? Например, localhost, app.site.com, app2.site.com и т. Д.? Обычно это происходит из-за этого.
Ogglas

0

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


0

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

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


0

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

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


0

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

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


0

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

Фактически, если вы определите структуру своего класса MyDto, это будет очень полезно
Чандан Кумар

Что ж, я не уверен, что это действительно будет очень полезно, и пример кода давно ушел, так что давайте скажемpublic class MyDto { public bool Whatever { get; set; } }
demoncodemonkey

Все зависит от того, как вы готовитесь myData. Если вы это делаете, myData=$('myForm').serialize()все должно работать нормально.
Sнаđошƒаӽ

-1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.