2013-07-25 6 views
17

Ich habe mir Beispiele dafür angeschaut, wie man das auf SO macht, und soweit ich das beurteilen kann, habe ich alle Beispiele ausprobiert, die ich bisher erfolglos finde. Ich habe versucht, einige der Implementierungen zu meinem Szenario zu ändern, aber dies ist bisher auch gescheitert.AJAX ValidateAntiForgeryToken ohne Formular an MVC messen Aktionsmethode

Ich habe dies auf meiner Seite in _layout.cshtml so immer habe ich ein Token verfügbar:

<form id="__AjaxAntiForgeryForm" action="#" method="post"> @Html.AntiForgeryToken()</form> 

ich diese Methode auch in meiner JavaScript utils-Datei:

AddAntiForgeryToken = function (data) { 
    data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val(); 
    return data; 
}; 

Das ist alles Arbeiten wie erwartet und ich bekomme ein Anti-Fälschungs-Token. Mein Istbuchung Code ist:

myPage.saveData = function() { 
    var saveUrl = '/exercises/PostData'; 

    var myData = JSON.stringify(myPage.contextsArrays); 

    $.ajax({ 
     type: 'POST', 
     async: false, 
     url: saveUrl, 
     data: AddAntiForgeryToken({ myResults: myData }), 
     success: function() { 
      alert('saved'); 
     }, 
     dataType: 'json', 
     contentType: "application/json; charset=utf-8" 
    }); 
}; 

Meine Aktion-Methode wie folgt aussieht:

[HttpPost, ValidateAntiForgeryToken, JsonExceptionFilter] 
    public JsonResult PostData(List<ResultsDc> myResults) 
    { 
     return Json(_apiClient.SubmitResults(myResults)); 
    } 

Ich habe dies getestet mit den verschiedenen Implementierungen Ich habe versucht, und die Antwort ist immer:

Ich poste kein Formular, es ist nur ein Array von Daten, aber die Überprüfung der Daten, die tatsächlich gebucht werden, sieht der Json nicht richtig aus (es ist alles codiert), aber der __RequestVerificationToken-Parametername ist re und der Token-Wert ist ebenfalls vorhanden.

Ich bin ziemlich verwirrt von all dem im Moment und kann nicht den richtigen Weg finden, um das Token zu senden, so dass meine MVC-Aktion aufgerufen wird. Wenn ich das ValidateAntiForgeryToken Attribut entferne und JSON.stringify(myPage.contextsArrays); als die Daten habe, sieht der JSON richtig (unverschlüsselt) aus und es bildet gut ab.

Wie bekomme ich dieses Token ordnungsgemäß ohne ein Formular?

+0

Ich bin verwirrt. Wenn Sie das nicht gesehen haben und Ihre Antwort unten ist jemand elses (Ich habe diesen Code auf anderen Antworten auf SO gesehen) Warum versuchen Sie, etwas zu beantworten, was Sie nicht verstehen? – Jammer

+0

Es ist nicht notwendig, Attribute zu trennen ... – Jammer

Antwort

27

Pappentwickler schlägt erneut zu.

Alles, was ich tun musste, war entfernen:

contentType: "application/json; charset=utf-8" 

Und das zu tun (was die Art von Post-Anforderung werden Änderungen vorgenommen), um den Json Inhalt der eigentlichen Daten Eigenschaft zu erhalten zu binden korrekt an Ihrem T Modelltyp NICHTJSON.stringify() die Daten.

+0

Lebensretter ... danke! Dieser Kommentar war alles, was ich nach 2 Tagen suchen brauchte. Viel verpflichtet. –

+0

Hervorragend! - Es folgten viele Lösungen, aber ohne Erfolg, dies entpuppte sich jedoch als Täter, vielen Dank! – Dal

+0

Danke! Verschwende Stunden hierauf !!! Artikel nach Artikel lesen und einfach nirgends hinkommen. Ich habe so viele verschiedene Dinge ausprobiert, aber alle haben das gleiche Endergebnis, nämlich das Verifizierungs-Token beim Posten, und ich konnte es nicht zum Laufen bringen, bis ich deinen Vorschlag durch Zufall gefunden habe !! Kann es immer noch nicht glauben! Ich danke Ihnen für das Teilen!! – Thierry

1

Die Validierung ist hardcodiert, um Formulardaten zu betrachten.

https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.WebPages/Helpers/AntiXsrf/AntiForgeryTokenStore.cs

public AntiForgeryToken GetFormToken(HttpContextBase httpContext) 
    { 
     string value = httpContext.Request.Form[_config.FormFieldName]; 

Sie können nach einem bestimmten Format ein Formular Vorlage simulieren. Siehe dazu How to mimic an HTML form submission in a POST request?

Wenn Sie möchten, können Sie auch einen eigenen Validator erstellen. How to POST JSON data to an Asp.Net MVC 2 app with ValidateAntiForgeryToken erklärt, wie man das macht. Es ist für MVC 2, aber Sie können einige Ideen davon abholen.

+0

Kaum hatte ich das gepostet, löste ich alles. – Jammer

+0

Das meiste davon ist komplett übertrieben und absolut unbenötigt ... – Jammer

+0

Sicher, der Custom Validator könnte als Overkill angesehen werden. Ich erkläre nur die Ursache des Problems und zwei mögliche Lösungen. Die Antwort, die du gepostet hast, ist so ziemlich das Endergebnis der Info in meinem ersten Link. – Stijn

9

(Anmerkung: Ich weiß dies, dass nicht alles ist ganz anders als das, was schon da ist)

Ich weiß, das bereits beantwortet wurde, aber ich habe diese ziemlich viel getan und werde meine Antwort in der der Stapel.Ich habe keine Formulare in meiner Site, also musste ich mir Wege ausdenken, damit umzugehen. Eine Menge Forschung hier über Stackoverflow und einige Blogs gaben mir endlich die Informationen, die ich brauchte.

Zuerst ist hier mein Code am Anfang meiner "Master" -Seite (MVC Razor):

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" })) 
{ 
    @Html.AntiForgeryToken() 
} 

Dann in allen Ajax-Aufrufe (jQuery), beginne ich wie folgt aus:

var token = $("#__AjaxAntiForgeryForm input").val(); 
var dataObject = { 
    __RequestVerificationToken: token, 
    myData: "whatever" 
}; 

$.ajax({ 
    url: '@Url.Action("action", "controller")', 
    type: 'POST', 
    dataType: 'json', 
    data: dataObject, 
    error: function (jqXHR, textStatus, errorThrown) { 
    console.log("ERROR!"); 
    }, 
    success: function (data) { 
    //whatever 
    } 
}); 

Schließlich wird in der Controller-Seite der Dinge, das funktioniert gut:

public class controllerController : Controller 
{ 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public JsonResult action (myModel myData) 
    { 
     return Json(new { Success = "true" }, JsonRequestBehavior.DenyGet); 
    } 
} 

Hoffentlich würde dies anderen helfen in der gleichen Boot.

Verwandte Themen