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ć?

Hemant Soni
źródło

Odpowiedzi:

218

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

Web Developer
źródło
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.

Justin Skiles
źródło
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
}
Subrata Sarkar
źródło
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()
  {
  ..
  }
Haiping Fan
źródło
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.

Vijaychandar
źródło
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.

rzymski
źródło
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).

GeoffM
źródło
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

juFo
źródło
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.

Sean
źródło
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()

Winnifred
źródło
2

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

<httpCookies domain=".wrong.domain.com" />
Michael Logutov
źródło
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;
  }
Ege Bayrak
źródło
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

Ogglas
źródło
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ął.

Goran Sneperger
źródło
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ł.

kevhann80
źródło
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

Doug
źródło
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.

Masoud Darvishian
źródło
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)
    {
        ...
    }
demoncodemonkey
źródło
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) { ....

Ran Lorch
źródło