Обов’язкове поле форми підробки «__RequestVerificationToken» відсутнє Помилка в реєстрації користувача


141

Я використовую Membership.createфункцію користувача, тоді виникає наступна помилка,

Обов’язкове поле форми підробки "__RequestVerificationToken" відсутнє

Як я можу це виправити?

Відповіді:


218

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


11
У мене є веб-сторінка, яка має таку ж проблему, але все це правильно. в чому помилка.
ПроведенийКлевер

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

@ConductedClever і мене теж. Це робота, але рідко отримую цю помилку, і я поняття не маю ЧОМУ?
QMaster

У мене все нормально, на моїх тестах це працює, на машині клієнта він працював до недавнього часу, але зараз це дає помилку. Я поняття не маю, чому. У когось є інші ідеї, ніж наведені тут, будь ласка?
Андрій Добрин

1
Html.AntiForgeryToken();не працює !! @Html.AntiForgeryToken()
Перехід

78

У моєму випадку я мав це у своєму web.config:

<httpCookies requireSSL="true" />

Але мій проект був налаштований не використовувати SSL. Коментуючи цю лінію або налаштовуючи проект, щоб завжди використовувати SSL, це вирішено.


3
У моєму випадку web.config вимагав SSL, але існували прив'язки IIS і до порту 80 і до 443, тому користувачі, що набирали https, отримували правильну поведінку, а користувачі, що набирали http, отримували цю помилку, вводячи правило переписати, щоб змусити всіх до https: / / {HTTP_HOST} / {R: 1} виправили це
user1069816

Дякую 😃 У моєму випадку IISце було прив'язування ( https » EmptyHostName » IP » 443), але не було обов'язкового для ( https » www.mysite.com » IP » 443). Тому я додав нове зв'язування з непустою ім'ям хоста для , httpsякий був дорівнює доменом і це вирішило проблему. У мене теж переписати налаштування, IISщоб змусити http 2 https.
ОЗУ

61

Подобається це:

Контролер

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

Вид:

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

Спробуйте використовувати лише в HTML
Subrata Sarkar

41

Також переконайтеся, що не використовуйте [ValidateAntiForgeryToken] під [HttpGet].

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

1
Ця відповідь доповнила інших і вирішила мою проблему! Спасибі
Лукас

1
Ця відповідь передбачає, що ви не зберігаєте поданих даних (які ви не повинні бути на HttpGet). Якщо ви є, то вам все ще потрібен захист XSRF, який надає [ValidateAntiForgeryToken].
thelem

9

Ви отримаєте помилку, навіть коли файли cookie не ввімкнено.


2
Хороший удар. Я використовував Internet Explorer. Використання браузера Chrome вирішило проблему для мене
FindOutIslamNow

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

7

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


6

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

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


5

Переконайтеся, що у контролері ваш атрибут http:

[HttpPost]

також додайте атрибут у контролері:

[ValidateAntiForgeryToken]

У своїй формі на свій погляд ви повинні написати:

@Html.AntiForgeryToken();

У мене був Html.AntiForgeryToken (); без знаку @, поки він знаходився в блоці коду, він не видав помилки в Razor, але робив під час виконання. Переконайтесь, що ви дивитесь на знак @ @ Html.Ant .. якщо він відсутній чи ні


5

У моєму випадку я мав цей 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);
});

... і це спрацювало чудово.


Як ви помітили, що анти-ключ впливає, коли ви відключили введення?
Сер

1
@Cer - якщо ви запитуєте, як я помітив, я перевірив запит у fiddler і зрозумів, що ключ не надсилається. Я прочитав, що Html надсилає, не включатиме відключені елементи керування. Тому я змінив його readonlyта виключив приховані елементи керування. Здається, добре працює.
Шон

3

Якщо хтось відчуває помилку з тієї ж причини, чому я її відчуваю, ось моє рішення:

якби ти мав Html.AntiForgeryToken();

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


2

У моєму випадку причиною неправильного домену в web.config для файлів cookie:

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

так! якщо ви на локальному комп'ютері введіть <httpCookies domain = "localhost" />, тоді тільки на локальних комп'ютерах файли cookie будуть працювати, і якщо ви спробуєте відкрити свій сайт на іншій машині, ви введете його ip (fe 192.168.1.43), який не буде працювати, бо шукає "localhost"
користувач3419036

2

У моєму випадку це було пов’язано з додаванням requireSSL=trueдо httpcookieswebconfig, що змусило 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

Отримала цю помилку в 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 У вас є кілька різних проектів / сайтів з тим самим доменом? Ex localhost, app.site.com та app2.site.com тощо? Зазвичай це відбувається через це.
Огглас

0

У моєму рішенні EPiServer на декількох контролерах був атрибут ContentOutputCache для дії Index, який прийняв HttpGet. Кожен перегляд для цих дій містив форму, яка надсилала до дії HttpPost на той же контролер або на інший. Щойно я видалив цей атрибут з усіх цих дій, що входять до індексу, вже не було.


0

Оскільки це з'являється при першому пошуку цього:

У мене ця проблема була лише в Internet Explorer, і я не міг з'ясувати, у чому проблема. Якщо коротко розповісти, це не врятувало частину файлів cookie Token, оскільки наш (під) домен підкреслив її. Працював у 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

-1

Я хотів би поділитися моїм, я слідкував за цим підручником з боротьбою з підробкою, використовуючи asp.net mvc 4 з angularjs, але він кидає виняток щоразу, коли я запитую, використовуючи $ http.post, і я зрозумів, що рішення просто додати "X- Запрошено-З ':' 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.