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ć?
asp.net-mvc-4
asp.net-membership
Hemant Soni
źródło
źródło
Html.AntiForgeryToken();
nie działa !! Przekształcanie się w@Html.AntiForgeryToken()
praceW 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.
źródło
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 nahttps
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:
Administrator
Widok:
źródło
Upewnij się również, że nie używaj [ValidateAntiForgeryToken] w [HttpGet].
źródło
Pojawi się błąd nawet wtedy, gdy pliki cookie nie są włączone.
źródło
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.
źródło
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).
źródło
Upewnij się, że w kontrolerze masz atrybut http, taki jak:
dodaj również atrybut w kontrolerze:
W swoim formularzu na swoim widoku musisz napisać:
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
źródło
W moim przypadku miałem ten javascript na przesłanym formularzu:
To powodowało usunięcie ukrytego RequestVerificationToken z wysyłanego formularza. Zmieniłem to na:
... i działało dobrze.
źródło
readonly
i wykluczyłem ukryte elementy sterujące. Wygląda na to, że dobrze działa.Jeśli ktoś napotka błąd z tego samego powodu, dla którego ja go doświadczam, oto moje rozwiązanie:
gdybyś miał
Html.AntiForgeryToken();
zmień to na
@Html.AntiForgeryToken()
źródło
W moim przypadku przyczyną była błędna domena w web.config dla cookies:
źródło
W moim przypadku było to spowodowane dodaniem
requireSSL=true
dohttpcookies
w webconfig, co spowodowało, że AntiForgeryToken przestał działać. Przykład:Aby zarówno
requireSSL=true
i@Html.AntiForgeryToken()
pracować Dodałem tę linię wewnątrzApplication_BeginRequest
INGlobal.asax
źródło
Ten błąd pojawił się w przeglądarce Chrome z domyślnym logowaniem do ASP.NET z indywidualnymi kontami użytkowników
.cshtml:
Kontroler:
Rozwiązany przez wyczyszczenie danych witryny dla witryny:
źródło
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ął.
źródło
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ł.
źródło
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
źródło
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.źródło
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();
Przykład
HTML
Javascript
Kontroler
źródło
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) { ....
źródło