Brak wymaganego pola formularza zapobiegającego fałszerstwom „__RequestVerificationToken” Błąd w rejestracji użytkownika


141

Używam Membership.createfunkcji użytkownika, pojawia się następujący błąd,

Brak wymaganego pola formularza zapobiegającego fałszerstwom „__RequestVerificationToken”

Jak mogę to naprawić?

Odpowiedzi:


218

Masz [ValidateAntiForgeryToken]atrybut przed swoim działaniem. Powinieneś również dodać @Html.AntiForgeryToken()w swoim formularzu.


11
Mam stronę internetową, na której występuje ten sam problem, ale wszystko jest w porządku. co za błąd.
ConductedClever

@ConductedClever Powinieneś dokładnie sprawdzić wszystko (pola, pliki cookie) za pomocą fiddlera i / lub firebuga (dowolnych narzędzi deweloperskich
webdeveloper

@ConductedClever me too. To działa, ale rzadko otrzymuję ten błąd i nie mam pojęcia, DLACZEGO?
QMaster

Mam wszystko ok, w moich testach działa, na maszynie klienta działało do niedawna, ale teraz daje ten błąd. Nie mam pojęcia dlaczego. Czy ktoś ma inne pomysły niż wymienione tutaj?
Andrei Dobrin

1
Html.AntiForgeryToken();nie działa !! Przekształcanie się w @Html.AntiForgeryToken()prace
FindOutIslamNow

78

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.


3
W moim przypadku plik web.config miał requireSSL, ale istniały powiązania IIS zarówno dla portu 80, jak i 443, więc użytkownicy wpisujący https otrzymywali poprawne zachowanie, a użytkownicy wpisujący http otrzymywali ten błąd, wprowadzając regułę przepisywania, aby wymusić wszystko na https: / / {HTTP_HOST} / {R: 1} naprawił to
user1069816

Dziękuję 😃 W moim przypadku IISbył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 httpsktóry była równa domeny i to rozwiązało problem. Mam przepisane ustawienia, IISaby wymusić http 2 httpsteż.
RAM

61

Lubię to:

Administrator

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

Widok:

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

Spróbuj używać tylko w HTML
Subrata Sarkar

41

Upewnij się również, że nie używaj [ValidateAntiForgeryToken] w [HttpGet].

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

1
Ta odpowiedź uzupełniła inne i rozwiązała mój problem! Dzięki
Lucas

1
Ta odpowiedź zakłada, że ​​nie zapisujesz żadnych przesłanych danych (których nie powinieneś znajdować w HttpGet). Jeśli tak, nadal potrzebujesz ochrony XSRF, którą zapewnia [ValidateAntiForgeryToken].
thelem

9

Pojawi się błąd nawet wtedy, gdy pliki cookie nie są włączone.


2
Dobry hit. Używałem Internet Explorera. Korzystanie z przeglądarki Chrome rozwiązało problem za mnie
FindOutIslamNow

To również rozwiązało mój problem. włączenie obsługi plików cookie w Google Chrome. Dzięki
The Scientific Method

7

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.


6

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).


5

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


5

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.


Jak zauważyłeś, że anty-klawisz wpłynął na wyłączenie wejść?
Cer

1
@Cer - jeśli pytasz, jak zauważyłem, sprawdziłem prośbę ze skrzypkiem i odebrałem, że klucz nie jest wysyłany. Czytałem, że przesłane HTML nie będą zawierały wyłączonych kontrolek. Więc zmieniłem to na readonlyi wykluczyłem ukryte elementy sterujące. Wygląda na to, że dobrze działa.
Sean

3

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()


2

W moim przypadku przyczyną była błędna domena w web.config dla cookies:

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

tak! jeśli na komputerze lokalnym wpisz <httpCookies domain = "localhost" />, to tylko na komputerze lokalnym będą działać pliki cookie, a jeśli spróbujesz otworzyć witrynę na innym komputerze, wpiszesz jej adres IP (np. 192.168.1.43), który nie zadziała, ponieważ szuka „localhost”
user3419036

2

W moim przypadku było to spowodowane dodaniem requireSSL=truedo httpcookiesw webconfig, co spowodowało, że AntiForgeryToken przestał działać. Przykład:

<system.web>
  <httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>

Aby zarówno requireSSL=truei @Html.AntiForgeryToken()pracować Dodałem tę linię wewnątrz Application_BeginRequestINGlobal.asax

    protected void Application_BeginRequest(object sender, EventArgs e)
  {
    AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
  }

2

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:

wprowadź opis obrazu tutaj


Ok, działa. Ale to się powtarza. W Firefoksie ten sam projekt działa poprawnie. Co mogę zrobić?
Czy Ürek

@ CanÜrek Czy masz kilka różnych projektów / witryn w tej samej domenie? Ex localhost, app.site.com i app2.site.com itd.? Zwykle dzieje się z tego powodu.
Ogglas

0

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ął.


0

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ł.


0

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


0

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.


0

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

  <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)
    {
        ...
    }

W rzeczywistości, jeśli zdefiniujesz strukturę swojej klasy MyDto, będzie to bardzo pomocne
Chandan Kumar

Cóż, nie jestem pewien, czy to rzeczywiście będzie bardzo pomocne, a przykładowy kod już dawno zniknął, więc powiedzmypublic class MyDto { public bool Whatever { get; set; } }
demoncodemonkey

-1

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) { ....

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.