Ich benutze die Membership.create
Benutzerfunktion, dann tritt der folgende Fehler auf:
Das erforderliche Fälschungsschutzfeld "__RequestVerificationToken" ist nicht vorhanden
Wie kann ich das beheben?
Ich benutze die Membership.create
Benutzerfunktion, dann tritt der folgende Fehler auf:
Das erforderliche Fälschungsschutzfeld "__RequestVerificationToken" ist nicht vorhanden
Wie kann ich das beheben?
Antworten:
Sie haben [ValidateAntiForgeryToken]
Attribut vor Ihrer Aktion. Sie sollten auch @Html.AntiForgeryToken()
in Ihrem Formular hinzufügen .
Html.AntiForgeryToken();
funktioniert nicht !! In @Html.AntiForgeryToken()
Werke
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.
IIS
gab 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 https
das war gleich der Domäne und es löste das Problem. Ich habe Einstellungen umgeschrieben IIS
, um sie http 2 https
auch zu erzwingen .
So was:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
Stellen Sie außerdem sicher, dass Sie [ValidateAntiForgeryToken] nicht unter [HttpGet] verwenden.
[HttpGet]
public ActionResult MethodName()
{
..
}
Sie erhalten den Fehler auch dann, wenn Cookies nicht aktiviert sind.
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.
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).
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
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.
readonly
und die versteckten Steuerelemente ausgeschlossen. Scheint gut zu funktionieren.
In meinem Fall war eine falsche Domain in web.config für Cookies der Grund:
<httpCookies domain=".wrong.domain.com" />
In meinem Fall war es auf das Hinzufügen requireSSL=true
zu httpcookies
in 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=true
und zu @Html.AntiForgeryToken()
funktionieren, habe ich diese Zeile in das Application_BeginRequest
In eingefügtGlobal.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
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:
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.
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.
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
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.
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();
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)
{
...
}
public class MyDto { public bool Whatever { get; set; } }
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)
{
....