Używam Membership.create
funkcji użytkownika, pojawia się następujący błąd,
Brak wymaganego pola formularza zapobiegającego fałszerstwom „__RequestVerificationToken”
Jak mogę to naprawić?
Używam Membership.create
funkcji użytkownika, pojawia się następujący błąd,
Brak wymaganego pola formularza zapobiegającego fałszerstwom „__RequestVerificationToken”
Jak mogę to naprawić?
Odpowiedzi:
Masz [ValidateAntiForgeryToken]
atrybut przed swoim działaniem. Powinieneś również dodać @Html.AntiForgeryToken()
w swoim formularzu.
Html.AntiForgeryToken();
nie działa !! Przekształcanie się w @Html.AntiForgeryToken()
prace
W moim przypadku miałem to w moim web.config:
<httpCookies requireSSL="true" />
Ale mój projekt miał nie używać SSL. Zakomentowanie tej linii lub ustawienie projektu tak, aby zawsze korzystał z SSL, rozwiązało problem.
IIS
było to wiązanie ( https » EmptyHostName » IP » 443
), ale nie było wiązania dla ( https » www.mysite.com » IP » 443
). Więc dodałem nowe wiązania z niepusty nazwy hosta na https
który była równa domeny i to rozwiązało problem. Mam przepisane ustawienia, IIS
aby wymusić http 2 https
też.
Lubię to:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
Upewnij się również, że nie używaj [ValidateAntiForgeryToken] w [HttpGet].
[HttpGet]
public ActionResult MethodName()
{
..
}
Pojawi się błąd nawet wtedy, gdy pliki cookie nie są włączone.
Inną rzeczą, która może to spowodować (właśnie wpadłem na to), jest następująca: jeśli z jakiegoś powodu wyłączysz wszystkie pola wejściowe w formularzu. wyłączy ukryte pole wejściowe, które przechowuje token weryfikacyjny. kiedy formularz zostanie wysłany z powrotem, brak będzie wartości tokena i wygeneruje błąd, którego brakuje. więc co musisz zrobić, to ponownie włączyć pole wejściowe, które zawiera token weryfikacyjny i wszystko będzie dobrze.
Inna możliwość dla tych z nas, którzy przesyłają pliki w ramach żądania. Jeśli długość zawartości przekracza, <httpRuntime maxRequestLength="size in kilo bytes" />
a używasz tokenów weryfikacji żądania, przeglądarka wyświetla 'The required anti-forgery form field "__RequestVerificationToken" is not present'
komunikat zamiast komunikatu o przekroczeniu długości żądania.
Ustawienie maxRequestLength na wartość dostatecznie dużą, aby zaspokoić żądanie, rozwiązuje natychmiastowy problem - chociaż przyznam, że nie jest to właściwe rozwiązanie (chcemy, aby użytkownik wiedział, jaki jest prawdziwy problem dotyczący rozmiaru pliku, a nie braku tokenów weryfikacji żądania).
Upewnij się, że w kontrolerze masz atrybut http, taki jak:
[HttpPost]
dodaj również atrybut w kontrolerze:
[ValidateAntiForgeryToken]
W swoim formularzu na swoim widoku musisz napisać:
@Html.AntiForgeryToken();
Miałem Html.AntiForgeryToken (); bez znaku @, gdy był w bloku kodu, nie spowodował błędu w Razor, ale zrobił to w czasie wykonywania. Upewnij się, że patrzysz na znak @ @ Html.Ant .. jeśli go brakuje, czy nie
W moim przypadku miałem ten javascript na przesłanym formularzu:
$('form').submit(function () {
$('input').prop('disabled', true);
});
To powodowało usunięcie ukrytego RequestVerificationToken z wysyłanego formularza. Zmieniłem to na:
$('form').submit(function () {
$('input[type=submit]').prop('disabled', true);
$('input[type=text]').prop('readonly', true);
$('input[type=password]').prop('readonly', true);
});
... i działało dobrze.
readonly
i wykluczyłem ukryte elementy sterujące. Wygląda na to, że dobrze działa.
W moim przypadku przyczyną była błędna domena w web.config dla cookies:
<httpCookies domain=".wrong.domain.com" />
W moim przypadku było to spowodowane dodaniem requireSSL=true
do httpcookies
w webconfig, co spowodowało, że AntiForgeryToken przestał działać. Przykład:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>
Aby zarówno requireSSL=true
i @Html.AntiForgeryToken()
pracować Dodałem tę linię wewnątrz Application_BeginRequest
INGlobal.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
Ten błąd pojawił się w przeglądarce Chrome z domyślnym logowaniem do ASP.NET z indywidualnymi kontami użytkowników
.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>
Kontroler:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
Rozwiązany przez wyczyszczenie danych witryny dla witryny:
W moim rozwiązaniu EPiServer na kilku kontrolerach był atrybut ContentOutputCache w akcji Index, która akceptowała HttpGet. Każdy widok tych akcji zawierał formularz, który był wysyłany do akcji HttpPost do tego samego kontrolera lub do innego. Gdy tylko usunąłem ten atrybut ze wszystkich tych działań indeksowania, problem zniknął.
Ponieważ pojawia się przy pierwszym wyszukiwaniu tego:
Miałem ten problem tylko w przeglądarce Internet Explorer i nie mogłem ustalić, na czym polega problem. Krótko mówiąc, nie zapisywał części cookie tokena, ponieważ nasza (pod) domena miała w niej podkreślenie. Pracował w Chrome, ale IE / Edge tego nie lubił.
Wszystkie inne odpowiedzi tutaj również są prawidłowe, ale jeśli żadna z nich nie rozwiązuje problemu, warto również sprawdzić, czy rzeczywiste nagłówki są przekazywane na serwer.
Na przykład w środowisku o zrównoważonym obciążeniu za nginx domyślną konfiguracją jest usunięcie nagłówka __RequestVerificationToken przed przekazaniem żądania do serwera, zobacz: prosty zwrotny serwer proxy nginx wydaje się usuwać niektóre nagłówki
Czasami piszesz metodę akcji formularza z listą wyników. W takim przypadku nie możesz pracować z jedną metodą akcji. Więc musisz mieć dwie metody akcji o tej samej nazwie. Jeden zi [HttpGet]
inny z [HttpPost]
atrybutem.
W swojej [HttpPost]
metodzie akcji ustaw [ValidateAntiForgeryToken]
atrybut, a także umieść @Html.AntiForgeryToken()
w formularzu HTML.
W moim przypadku otrzymałem ten błąd podczas tworzenia posta AJAX, okazało się, że wartość __RequestVerificationToken nie była przekazywana w wywołaniu. Musiałem ręcznie znaleźć wartość tego pola i ustawić to jako właściwość obiektu danych, który jest wysyłany do punktu końcowego.
to znaczy
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
});
Kontroler
[HttpPost]
[Route("myUrl")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> MyUrlAsync(MyDto dto)
{
...
}
public class MyDto { public bool Whatever { get; set; } }
chciałbym udostępnić mój, śledziłem ten samouczek dotyczący zapobiegania fałszowaniu
przy użyciu asp.net mvc 4 z angularjs, ale za każdym razem, gdy żądam użycia $ http.post, zgłasza wyjątek i zorientowałem się, że rozwiązaniem jest po prostu dodanie
„X- Requested-With ':' XMLHttpRequest ' do nagłówków $ http.post, ponieważ wygląda na (filterContext.HttpContext.Request.IsAjaxRequest())
to, że nie rozpoznaje go jako Ajax, a oto mój przykładowy kod.
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)
{
....