Я использую Membership.create
пользовательскую функцию, тогда возникает следующая ошибка:
Отсутствует обязательное поле формы защиты от подделки "__RequestVerificationToken"
Как я могу это исправить?
asp.net-mvc-4
asp.net-membership
Хемант Сони
источник
источник
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 (); без знака @, когда он был в блоке кода, он не выдавал ошибки в Razor, но выдавал во время выполнения. Убедитесь, что вы смотрите на знак @ в @ Html.Ant .., если он отсутствует или нет
источник
Если у кого-то возникает ошибка по той же причине, по которой я ее испытываю, вот мое решение:
если у тебя есть
Html.AntiForgeryToken();
измените это на
@Html.AntiForgeryToken()
источник
В моем случае это было связано с добавлением
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) { ....
источник