Я використовую Membership.create
функцію користувача, тоді виникає наступна помилка,
Обов’язкове поле форми підробки "__RequestVerificationToken" відсутнє
Як я можу це виправити?
Я використовую Membership.create
функцію користувача, тоді виникає наступна помилка,
Обов’язкове поле форми підробки "__RequestVerificationToken" відсутнє
Як я можу це виправити?
Відповіді:
Ви маєте [ValidateAntiForgeryToken]
атрибут перед вашою дією. Ви також повинні додати @Html.AntiForgeryToken()
у свою форму.
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 на значення, яке достатньо велике, щоб задовольнити запит, виліковує негайну проблему - хоча я визнаю, це не правильне рішення (ми хочемо, щоб користувач знав справжню проблему розміру файлу, а не те, що маркерів для підтвердження запиту відсутнє).
Переконайтеся, що у контролері ваш атрибут http:
[HttpPost]
також додайте атрибут у контролері:
[ValidateAntiForgeryToken]
У своїй формі на свій погляд ви повинні написати:
@Html.AntiForgeryToken();
У мене був Html.AntiForgeryToken (); без знаку @, поки він знаходився в блоці коду, він не видав помилки в Razor, але робив під час виконання. Переконайтесь, що ви дивитесь на знак @ @ Html.Ant .. якщо він відсутній чи ні
У моєму випадку я мав цей 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);
});
... і це спрацювало чудово.
readonly
та виключив приховані елементи керування. Здається, добре працює.
У моєму випадку причиною неправильного домену в web.config для файлів cookie:
<httpCookies domain=".wrong.domain.com" />
У моєму випадку це було пов’язано з додаванням 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;
}
Отримала цю помилку в 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 Token, оскільки наш (під) домен підкреслив її. Працював у 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; } }
Я хотів би поділитися моїм, я слідкував за цим підручником
з боротьбою з підробкою, використовуючи 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)
{
....