0

Ich habe ASP.NET MVC 5 Anwendung mit. Net 4.5.1. Die Anwendung verfügt über mehrere jQuery ajax post-Methode, die Daten an den Server POST. Um zu verhindern, standortübergreifende Anfrage Fälschung (XSRF) i hinzugefügt haben die folgenden in _layout.cshtmlValidateAntiForgeryToken funktioniert nicht asp.net mvc mit Ajax Post

@Html.AntiForgeryToken() 

und Javascript, das auch das Token mit allen ajax POST sendet in Httpheader

$(document).ajaxSend(function (event, jqXHR, ajaxOptions) { 
      if (ajaxOptions.type === 'POST') { 
       jqXHR.setRequestHeader('__RequestVerificationToken', $('input[name="__RequestVerificationToken"]').val()); 
      }     
     }); 

und dann in der Steuereinrichtung Aktionsmethode ich habe

[ValidateAntiForgeryToken]   
    [HttpPost] 
    public ActionResult Save(MyModel model) 
    { 
     //save and return json data 
    } 

jedoch ValidateAntiForgeryToken Ausnahme thorwing

Das erforderliche fälschungssichere Formularfeld "__RequestVerificationToken" ist nicht vorhanden.

Ich habe überprüft, dass __RequestVerificationToken für jeden Ajax POST zu httpheader hinzugefügt wird.

Ich habe eine andere Anwendung, die mit ASP.NET Core entwickelt wurde, und ich habe die gleiche Funktionalität dort (außer der Header-Name ist RequestVerificationToken anstelle von __RequestVerificationToken) und seine Arbeit in ASP.NET Core.

Warum funktioniert das nicht in ASP.NET MVC, wenn Token im Header enthalten ist? Gibt es einen Unterschied ValidateAntiForgeryToken in ASP.NET Core vs ASP.NET MVC 5?

+0

Mögliche Duplikat [jQuery Ajax Anrufe und die Html.AntiForgeryToken hinzufügen ()] (http://stackoverflow.com/questions/4074199/jquery-ajax-calls-and-the-html-antiforgerytoken) – VahidN

+0

@VahidN es ist nicht das gleiche Problem. Ich habe den bereitgestellten Link vorher durchlaufen. – LP13

Antwort

1

Um Ihr Problem zu beheben, bleibt alles gleich, außer für setRequestHeader. Pass __RequestVerificationToken in Anfrage Körper

data: { 
       __RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val(), 
       // Other properties of data 
      }, 
+0

ja in asp.net mvc wenn ich daten hinzufügen dann funktioniert es? Aber ich denke, in asp.net Kern funktioniert es, ob Sie in "Daten" oder in "Header" hinzufügen. Um mein Problem zu lösen, habe ich Custom ValidateAntiForgeryTokenAttribute implementiert. – LP13

+0

Asp.net-Kern prüft Header und Body sowohl für Token. – Kaushal

0

Zu meinem Problem zu lösen i benutzerdefinierte ValidateAntiForgeryToken umgesetzt haben. Ich habe beschlossen, Token in den Header aufzunehmen.

  1. Ich habe mehr Ajax-POST-Methode im gesamten Anwendung, also statt es auf jeder Aktion Methode Hinzufügen möchte ich es global validieren.
  2. Auf Client-Seite möchte ich das Token implizit für jede AJAX POST-Anfrage enthalten. (Anwendung verfügt auch über Kendo Gitter, die Ajax Post-Anforderung macht Daten zu erhalten)
  3. Ajax Post data JSON-Objekt oder serialisierte Form sein könnte, die macht das Hinzufügen __RequestVerificationToken zu data wenig heikel (nicht unmöglich), vor allem, wenn ich will, damit umzugehen global.

So, hier ist meine komplette Code

Filter

public class ValidatePostAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter 
    { 
     private const string _tokenKey = "__RequestVerificationToken"; 
     public void OnAuthorization(AuthorizationContext filterContext) 
     { 
      if (filterContext == null) 
      { 
       throw new ArgumentNullException("filterContext"); 
      } 

      if (filterContext.HttpContext.Request.HttpMethod.ToUpper() == "POST") 
      { 
       if (filterContext.HttpContext.Request.IsAjaxRequest()) 
       { 
        if (filterContext.HttpContext.Request.Cookies.Get(_tokenKey) == null || 
        filterContext.HttpContext.Request.Headers.Get(_tokenKey) == null) 
        { 
         throw new HttpPostAntiForgeryException("Invalid Verification Token."); 
        } 

        AntiForgery.Validate(filterContext.HttpContext.Request.Cookies[_tokenKey].Value, filterContext.HttpContext.Request.Headers[_tokenKey]); 
       }     
      } 
     } 
    } 

Exception

public sealed class HttpPostAntiForgeryException : HttpException 
{ 
    public HttpPostAntiForgeryException() 
    { 
    } 
    public HttpPostAntiForgeryException(string message) : base(message) 
    { 
    } 
} 

Filter hinzufügen global

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
     filters.Add(new AuthorizeAttribute() { Order = 0 }); 
     filters.Add(new ValidatePostAntiForgeryTokenAttribute() { Order = 1 }); 
    } 
} 

_layout.cshtml - js Token

$.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
       if (originalOptions.type === "POST") 
        jqXHR.setRequestHeader('__RequestVerificationToken', $('input[name="__RequestVerificationToken"]').val()); 
      }); 

Add-Token in _layout.cshtml

@Html.AntiForgeryToken() 
Verwandte Themen