2017-07-18 5 views
1

Ich habe unseren MVC-Code von Version 2.0 auf 4.0 aktualisiert. Und jetzt erhalte ich den folgenden Fehler: "Ein erforderliches Anti-Fälschungs-Token wurde nicht geliefert oder war ungültig."AntiForgeryToken ist ungültig

Ich füge den Code unten in ValidateAntiForgeryTokenAttribute.cs:

public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     string httpMethodOverride = filterContext.HttpContext.Request.GetHttpMethodOverride(); 
     if (!this.verbs.Verbs.Contains(httpMethodOverride, StringComparer.OrdinalIgnoreCase)) 
     { 
      return; 
     } 

     AntiForgeryDataSerializer antiForgeryDataSerializer = new AntiForgeryDataSerializer(); 
     AntiForgeryData antiForgeryData = new AntiForgeryData(); 
     string fieldName = antiForgeryData.GetAntiForgeryTokenName(null); 
     string cookieName = antiForgeryData.GetAntiForgeryTokenName(filterContext.HttpContext.Request.ApplicationPath); 


     HttpCookie cookie = filterContext.HttpContext.Request.Cookies[cookieName]; 

     if (cookie == null || String.IsNullOrEmpty(cookie.Value)) 
     { 
      throw CreateValidationException(); 
     } 

     AntiForgeryData cookieToken = antiForgeryDataSerializer.Deserialize(cookie.Value); 
     //Rest of the code here// 
     } 

In "filterContext", die Cookie-Namen "_RequestVerificationToken" ist und dann füge ich den Pfadnamen. Der Pfadname wird in Base64 codiert und zum "AntiForgeryFieldName" hinzugefügt, und dies wird "_RequestVerificationToken_Lw__". Wenn wir überprüfen, ob der Cookie existiert, können wir ihn offensichtlich nicht finden und erhalten die AntiForgery-Ausnahme. Aber in der alten Version dieses Codes kommt der Cookie-Wert in "filterContext" als "_RequestVerificationToken_Lw__" und funktioniert daher gut. Also, wo ist das Problem hier? Ist es etwas mit Maschinentasten oder etwas anderes?

Vielen Dank im Voraus.

+2

Ich bin mir nicht ganz sicher, ob ich verstehe, was Sie hier tun. Anti-Fälschung ist in MVC integriert. Du brauchst kein eigenes Attribut. Verwenden Sie einfach das integrierte Attribut "ValidationAntiForgeryToken" für Ihre Controller-Aktion und "@ Html.AntiForgeryToken()" in Ihrer Ansicht. –

Antwort

0

@ Html.AntiForgeryToken() Aufruf in der Ansicht ein neues Token erzeugt und in der Form wie folgt schreibt:

<form action="..." method="post">   
    <input name="__RequestVerificationToken" type="hidden"   
     value="J56khgCvbE3bVcsCSZkNVuH9Cclm9SSIT/ywruFsXEgmV8CL2eW5C/gGsQUf/YuP" /> 
     <!-- Other fields. -->  
</form> 

und auch in die Cookie schreibt:

__RequestVerificationToken_Lw__= 
    J56khgCvbE3bVcsCSZkNVuH9Cclm9SSIT/ywruFsXEgmV8CL2eW5C/gGsQUf/YuP 

Wenn die Obiges Formular wird übermittelt, sie werden beide an den Server gesendet.

In der Server-Seite [ValidateAntiForgeryToken] Attribut wird die Controller oder Aktionen angeben verwendet, um sie zu überprüfen:

[HttpPost] 
[ValidateAntiForgeryToken()] 
public ActionResult Action(/* ... */) 
{ 
    // ... 
} 

Alles was Sie tun müssen, ist die AntiForgeryToken in der Ansicht und geben Sie „ValidateAntiForgeryToken“ aufzurufen Attribut für die Controller-Aktion.

+0

Danke für die Antwort. Ja, wir haben das @ html.AntiForgeryToken() in View und wir haben das Attribut [ValidateAntiForgeryToken] im Controller verwendet. So wird es in der "OnAuthorization" -Methode gelandet, die ich in der Frage angegeben habe. Das große Problem, mit dem wir konfrontiert wurden, ist, dass der Cookie "_RequestVerification_Lw__" in MVC 4.0 nicht für uns generiert wird. HttpContext.Request.Cookies hat nur "_RequestVerificationToken" als Cookie-Name und einen entsprechenden codierten Wert darin. Jede Hilfe wird geschätzt. –

+0

Wenn ich nur Quelle anzeigen, wird "__RequestVerificationToken" generiert. Sie können versuchen, diese Codezeile hinzuzufügen, um nur mit "__RequestVerificationToken" zu validieren, anstatt "CreateValidationException" auszulösen, wenn der Cookie nicht gefunden wird. Lass mich wissen ob es funktioniert! AntiForgery.Validate (Cookie! = Null? Cookie.Value: null, httpContext.Request.Headers ["__ RequestVerificationToken"]); – SailajaPalakodeti

+0

Diese Änderung löst den folgenden Fehler aus: Serverfehler in '/' Application. Der erforderliche Anti-Fälschungs-Cookie "__RequestVerificationToken" ist nicht vorhanden. Beschreibung: Bei der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stack-Trace für weitere Informationen über den Fehler und wo es aus dem Code stammt. Ausnahmedetails: System.Web.Mvc.HttpAntiForgeryException: Der erforderliche Anti-Fälschungs-Cookie "__RequestVerificationToken" ist nicht vorhanden. –