Das erforderliche Fälschungsschutzfeld "__RequestVerificationToken" ist nicht vorhanden. Fehler bei der Benutzerregistrierung

141

Ich benutze die Membership.createBenutzerfunktion, dann tritt der folgende Fehler auf:

Das erforderliche Fälschungsschutzfeld "__RequestVerificationToken" ist nicht vorhanden

Wie kann ich das beheben?

Hemant Soni
quelle

Antworten:

218

Sie haben [ValidateAntiForgeryToken]Attribut vor Ihrer Aktion. Sie sollten auch @Html.AntiForgeryToken()in Ihrem Formular hinzufügen .

Web-Entwickler
quelle
11
Ich habe eine Webseite, die das gleiche Problem hat, aber die ganzen Dinge sind korrekt. Was ist der Fehler?
ConductedClever
@ConductedClever Sie sollten alles (Felder, Cookies) sorgfältig mit Fiddler und / oder Firebug (alle Browser-Entwickler-Tools) überprüfen. Lesen Sie diesen Artikel: asp.net/web-api/overview/security/…
Webdeveloper
@ ConductedClever mich auch. Das ist Arbeit, bekomme aber selten diesen Fehler und ich habe keine Ahnung WARUM?
QMaster
Ich habe alles in Ordnung, in meinen Tests funktioniert es, auf dem Computer eines Clients hat es bis vor kurzem funktioniert, aber jetzt gibt es diesen Fehler. Ich habe keine Idee warum. Hat jemand andere Ideen als die hier aufgeführten?
Andrei Dobrin
1
Html.AntiForgeryToken();funktioniert nicht !! In @Html.AntiForgeryToken()Werke
verwandeln
78

In meinem Fall hatte ich dies in meiner web.config:

<httpCookies requireSSL="true" />

In meinem Projekt wurde jedoch kein SSL verwendet. Das Auskommentieren dieser Zeile oder das Einrichten des Projekts für die Verwendung von SSL löste das Problem.

Justin Skiles
quelle
3
In meinem Fall hatte die web.config requireSSL, aber es gab IIS-Bindungen für Port 80 und 443, sodass Benutzer, die https eingaben, korrektes Verhalten zeigten und Benutzer, die http eingaben, diesen Fehler erhielten und eine Umschreiberegel einführten, um alle auf https zu zwingen: / / {HTTP_HOST} / {R: 1} behoben
user1069816
Vielen Dank 😃 In meinem Fall IISgab es diese Bindung ( https » EmptyHostName » IP » 443), aber es gab keine Bindung für ( https » www.mysite.com » IP » 443). So habe ich eine neue Bindung mit einem hinzu nicht leeren Hostnamen für httpsdas war gleich der Domäne und es löste das Problem. Ich habe Einstellungen umgeschrieben IIS, um sie http 2 httpsauch zu erzwingen .
RAM
61

So was:

Der Controller

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

Die Aussicht:

@using(Html.BeginForm())
{
     @Html.AntiForgeryToken()
     <input name="..." type="text" />
     // rest
}
Subrata Sarkar
quelle
Versuchen Sie es nur in HTML
Subrata Sarkar
41

Stellen Sie außerdem sicher, dass Sie [ValidateAntiForgeryToken] nicht unter [HttpGet] verwenden.

  [HttpGet]
  public ActionResult MethodName()
  {
  ..
  }
Haiping Fan
quelle
1
Diese Antwort ergänzte die anderen und löste mein Problem! Vielen Dank
Lucas
1
Bei dieser Antwort wird davon ausgegangen, dass Sie keine übermittelten Daten speichern (die Sie nicht auf einem HttpGet haben sollten). Wenn ja, benötigen Sie weiterhin den XSRF-Schutz, den [ValidateAntiForgeryToken] bietet.
Thelem
9

Sie erhalten den Fehler auch dann, wenn Cookies nicht aktiviert sind.

Vijaychandar
quelle
2
Guter Treffer. Ich habe den Internet Explorer verwendet. Die Verwendung des Chrome-Browsers löste das Problem für mich
FindOutIslamNow
Dies löste auch mein Problem. Cookies in Google Chrome aktivieren. Danke
Die wissenschaftliche Methode
7

Eine andere Sache, die dies verursachen kann (ist gerade darauf gestoßen), ist die folgende: Wenn Sie aus irgendeinem Grund alle Ihre Eingabefelder in Ihrem Formular deaktivieren. Dadurch wird das versteckte Eingabefeld deaktiviert, in dem sich Ihr Bestätigungstoken befindet. Wenn das Formular zurückgeschickt wird, fehlt der Token-Wert und generiert den Fehler, dass er fehlt. Sie müssen also das Eingabefeld, das das Bestätigungstoken enthält, wieder aktivieren, und alles wird gut.

römisch
quelle
6

Eine weitere Möglichkeit für diejenigen von uns, Dateien als Teil der Anfrage hochzuladen. Wenn die Inhaltslänge überschritten wird <httpRuntime maxRequestLength="size in kilo bytes" /> und Sie Anforderungsüberprüfungstoken verwenden, zeigt der Browser die 'The required anti-forgery form field "__RequestVerificationToken" is not present'Nachricht anstelle der angeforderten Anforderungslänge an.

Das Festlegen von maxRequestLength auf einen Wert, der groß genug ist, um die Anforderung zu erfüllen, behebt das unmittelbare Problem - obwohl ich zugeben werde, dass dies keine geeignete Lösung ist (wir möchten, dass der Benutzer das wahre Problem der Dateigröße kennt, nicht das der fehlenden Token für die Anforderungsüberprüfung).

GeoffM
quelle
5

Stellen Sie in Ihrem Controller sicher, dass Sie Ihr http-Attribut wie folgt haben:

[HttpPost]

Fügen Sie außerdem das Attribut im Controller hinzu:

[ValidateAntiForgeryToken]

In Ihrem Formular aus Ihrer Sicht müssen Sie schreiben:

@Html.AntiForgeryToken();

Ich hatte Html.AntiForgeryToken (); Ohne das @ -Zeichen in einem Codeblock gab es in Razor keinen Fehler, sondern zur Laufzeit. Stellen Sie sicher, dass Sie sich das @ -Zeichen von @ Html.Ant .. ansehen, ob es fehlt oder nicht

juFo
quelle
5

In meinem Fall hatte ich dieses Javascript auf dem Formular einreichen:

$('form').submit(function () {
    $('input').prop('disabled', true);
});

Dadurch wurde das versteckte RequestVerificationToken aus dem übermittelten Formular entfernt. Ich habe das geändert in:

$('form').submit(function () {
    $('input[type=submit]').prop('disabled', true);
    $('input[type=text]').prop('readonly', true);
    $('input[type=password]').prop('readonly', true);
});

... und es hat gut funktioniert.

Sean
quelle
Wie haben Sie festgestellt, dass der Anti-Key betroffen ist, als Sie Eingaben deaktiviert haben?
Cer
1
@Cer - Wenn Sie fragen, wie ich es bemerkt habe, habe ich die Anfrage mit dem Geiger überprüft und festgestellt, dass der Schlüssel nicht gesendet wurde. Ich habe gelesen, dass HTML-Einreichungen keine deaktivierten Steuerelemente enthalten. Also habe ich es geändert readonlyund die versteckten Steuerelemente ausgeschlossen. Scheint gut zu funktionieren.
Sean
3

Wenn jemand den Fehler aus demselben Grund auftritt, aus dem ich ihn erlebe, ist hier meine Lösung:

wenn du hättest Html.AntiForgeryToken();

ändere es auf @Html.AntiForgeryToken()

Winnifred
quelle
2

In meinem Fall war eine falsche Domain in web.config für Cookies der Grund:

<httpCookies domain=".wrong.domain.com" />
Michael Logutov
quelle
yeep! Wenn Sie auf einem lokalen Computer <httpCookies domain = "localhost" /> eingeben, funktionieren nur Cookies auf einem lokalen Computer. Wenn Sie versuchen, Ihre Site auf einem anderen Computer zu öffnen, geben Sie die IP-Adresse (z. B. 192.168.1.43) ein, die nicht funktioniert es sucht nach "localhost"
user3419036
2

In meinem Fall war es auf das Hinzufügen requireSSL=truezu httpcookiesin webconfig zurückzuführen, wodurch das AntiForgeryToken nicht mehr funktionierte. Beispiel:

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

Um beides zu machen requireSSL=trueund zu @Html.AntiForgeryToken()funktionieren, habe ich diese Zeile in das Application_BeginRequestIn eingefügtGlobal.asax

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

Dieser Fehler wurde in Chrome mit der Standardanmeldung für ASP.NET mit einzelnen Benutzerkonten angezeigt

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

Regler:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)

Gelöst durch Löschen von Site-Daten für die Site:

Geben Sie hier die Bildbeschreibung ein

Ogglas
quelle
Ok, es hat funktioniert. Aber das passiert immer wieder. In Firefox wird dasselbe Projekt ordnungsgemäß ausgeführt. Was kann ich tun?
Kann Ürek
@ CanÜrek Haben Sie mehrere verschiedene Projekte / Sites mit derselben Domain? Ex localhost, app.site.com und app2.site.com usw.? Es passiert normalerweise aus diesem Grund.
Ogglas
0

In meiner EPiServer-Lösung auf mehreren Controllern gab es ein ContentOutputCache-Attribut für die Index-Aktion, das HttpGet akzeptierte. Jede Ansicht für diese Aktionen enthielt ein Formular, das an eine HttpPost-Aktion auf demselben oder einem anderen Controller gesendet wurde. Sobald ich dieses Attribut aus all diesen Indexaktionen entfernt hatte, war das Problem behoben.

Goran Sneperger
quelle
0

Weil dies bei der ersten Suche dazu kommt:

Ich hatte dieses Problem nur in Internet Explorer und konnte nicht herausfinden, was das Problem war. Kurz gesagt, es wurde nicht der Cookie-Teil des Tokens gespeichert, da unsere (Unter-) Domain einen Unterstrich enthielt. Arbeitete in Chrome, aber IE / Edge mochte es nicht.

kevhann80
quelle
0

Alle anderen Antworten hier sind ebenfalls gültig. Wenn jedoch keine der Antworten das Problem löst, sollten Sie auch überprüfen, ob die tatsächlichen Header an den Server übergeben werden.

In einer Umgebung mit Lastenausgleich hinter nginx besteht die Standardkonfiguration beispielsweise darin , den Header __RequestVerificationToken zu entfernen, bevor die Anforderung an den Server weitergeleitet wird. Siehe: Einfacher Nginx-Reverse-Proxy scheint einige Header zu entfernen

Doug
quelle
0

Manchmal schreiben Sie eine Formularaktionsmethode mit einer Ergebnisliste. In diesem Fall können Sie nicht mit einer Aktionsmethode arbeiten. Sie müssen also zwei Aktionsmethoden mit demselben Namen haben. Eins mit [HttpGet]und eins mit [HttpPost]Attribut.

Legen Sie in Ihrer [HttpPost]Aktionsmethode das [ValidateAntiForgeryToken]Attribut fest und fügen Sie es @Html.AntiForgeryToken()in Ihr HTML-Formular ein.

Masoud Darvishian
quelle
0

In meinem Fall wurde dieser Fehler beim Erstellen eines AJAX-Posts angezeigt. Es stellte sich heraus, dass der Wert __RequestVerificationToken im Aufruf nicht weitergegeben wurde. Ich musste den Wert dieses Feldes manuell ermitteln und als Eigenschaft für das Datenobjekt festlegen, das an den Endpunkt gesendet wird.

dh data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();


Beispiel

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
});

Regler

    [HttpPost]
    [Route("myUrl")]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> MyUrlAsync(MyDto dto)
    {
        ...
    }
Dämoncodemonkey
quelle
Wenn Sie die Struktur Ihrer MyDto-Klasse definieren, ist dies sehr hilfreich
Chandan Kumar,
Nun, ich bin mir nicht sicher, ob es wirklich sehr hilfreich sein wird und der Beispielcode ist schon lange nicht mehr vorhanden. Sagen wir alsopublic class MyDto { public bool Whatever { get; set; } }
Demoncodemonkey
-1

Ich möchte meine teilen, ich habe dieses Anti-Fälschungs-Tutorial mit asp.net mvc 4 mit anglejs verfolgt, aber es löst jedes Mal eine Ausnahme aus, wenn ich mit $ http.post anfordere und herausgefunden habe, dass die Lösung einfach 'X- Requested-With ':' XMLHttpRequest ' an die Header von $ http.post, da es so aussieht, als würde der (filterContext.HttpContext.Request.IsAjaxRequest()) es nicht als Ajax erkennen und hier ist mein Beispielcode.

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
quelle