include antiforgerytoken in ajax dopo ASP.NET MVC

Sto avendo problemi con AntiForgeryToken con ajax. Sto usando ASP.NET MVC 3. Ho provato la soluzione nelle chiamate jQuery Ajax e Html.AntiForgeryToken () . Usando questa soluzione, il token viene ora passato:

var data = { ... } // with token, key is '__RequestVerificationToken' $.ajax({ type: "POST", data: data, datatype: "json", traditional: true, contentType: "application/json; charset=utf-8", url: myURL, success: function (response) { ... }, error: function (response) { ... } }); 

Quando rimuovo l’attributo [ValidateAntiForgeryToken] solo per vedere se i dati (con il token) vengono passati come parametri al controller, posso vedere che vengono passati. Ma per qualche ragione, il A required anti-forgery token was not supplied or was invalid. il messaggio appare ancora quando riporto l’attributo.

Qualche idea?

MODIFICARE

L’antiforgerytoken viene generato all’interno di un modulo, ma non sto utilizzando un’azione di invio per inviarlo. Invece, sto solo ottenendo il valore del token usando jquery e poi provando a postare su Ajax.

Ecco la forma che contiene il token e si trova nella pagina principale in alto:

 
@Html.AntiForgeryToken()

Hai specificato in modo errato contentType su application/json .

Ecco un esempio di come questo potrebbe funzionare.

controller:

 public class HomeController : Controller { public ActionResult Index() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Index(string someValue) { return Json(new { someValue = someValue }); } } 

Vista:

 @using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" })) { @Html.AntiForgeryToken() } 
Click me to send an AJAX request to a controller action decorated with the [ValidateAntiForgeryToken] attribute

Un altro approccio (meno javascriptish), che ho fatto, è qualcosa di simile a questo:

Innanzitutto, un helper Html

 public static MvcHtmlString AntiForgeryTokenForAjaxPost(this HtmlHelper helper) { var antiForgeryInputTag = helper.AntiForgeryToken().ToString(); // Above gets the following:  var removedStart = antiForgeryInputTag.Replace(@"", ""); if (antiForgeryInputTag == removedStart || removedStart == tokenValue) throw new InvalidOperationException("Oops! The Html.AntiForgeryToken() method seems to return something I did not expect."); return new MvcHtmlString(string.Format(@"{0}:""{1}""", "__RequestVerificationToken", tokenValue)); } 

che restituirà una stringa

 __RequestVerificationToken:"P5g2D8vRyE3aBn7qQKfVVVAsQc853s-naENvpUAPZLipuw0pa_ffBf9cINzFgIRPwsf7Ykjt46ttJy5ox5r3mzpqvmgNYdnKc1125jphQV0NnM5nGFtcXXqoY3RpusTH_WcHPzH4S4l1PmB8Uu7ubZBftqFdxCLC5n-xT0fHcAY1" 

quindi possiamo usarlo in questo modo

 $(function () { $("#submit-list").click(function () { $.ajax({ url: '@Url.Action("SortDataSourceLibraries")', data: { items: $(".sortable").sortable('toArray'), @Html.AntiForgeryTokenForAjaxPost() }, type: 'post', traditional: true }); }); }); 

E sembra funzionare!

è così semplice! quando usi @Html.AntiForgeryToken() nel tuo codice html significa che il server ha firmato questa pagina e ogni richiesta che viene inviata al server da questa particolare pagina ha un segno che non può inviare una richiesta falsa da parte di hacker. pertanto, affinché questa pagina venga autenticata dal server, è necessario seguire due passaggi:

__RequestVerificationToken un parametro denominato __RequestVerificationToken e per ottenere il suo valore utilizzare i seguenti codici:

  

per esempio fare una chiamata Ajax

 $.ajax({ type: "POST", url: "/Account/Login", data: { __RequestVerificationToken: gettoken(), uname: uname, pass: pass }, dataType: 'json', contentType: 'application/x-www-form-urlencoded; charset=utf-8', success: successFu, }); 

e il passaggio 2 decora semplicemente il tuo metodo di azione [ValidateAntiForgeryToken]



         function DeletePersonel (id) {

                 var data = new FormData ();
                 data.append ("__ RequestVerificationToken", "@ HtmlHelper.GetAntiForgeryToken ()");

                 $ .ajax ({
                     digitare: 'POST',
                     url: '/ Personel / Delete /' + id,
                     dati: dati,
                     cache: falso,
                     processData: false,
                     contentType: false,
                     success: function (result) {

                     }
                 });

         }
    

         public static class HtmlHelper
         {
             stringa statica pubblica GetAntiForgeryToken ()
             {
                 System.Text.RegularExpressions.Match value = System.Text.RegularExpressions.Regex.Match (System.Web.Helpers.AntiForgery.GetHtml (). ToString (), "(?: Value = \") (. *) (? : \ ")");
                 if (value.Success)
                 {
                     return value.Groups [1] .Value;
                 }
                 ritorno "";
             }
         }

So che questa è una vecchia domanda. Ma aggiungerò comunque la mia risposta, potrebbe aiutare qualcuno come me.

Se non si desidera elaborare il risultato dall’azione post del controller, ad esempio chiamando il metodo LoggOff del controller Accounts , è ansible eseguire la seguente versione della risposta di @DarinDimitrov:

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

Ho provato un sacco di workarrounds e non hanno funzionato per me. L’eccezione era “Il campo modulo anti-falsificazione richiesto” __RequestVerificationToken “.

Quello che mi ha aiutato è stato passare da .ajax a .post:

 $.post( url, $(formId).serialize(), function (data) { $(formId).html(data); }); 

In Asp.Net MVC quando si utilizza @Html.AntiForgeryToken() Razor crea un campo di input nascosto con nome __RequestVerificationToken per memorizzare token. Se si desidera scrivere un’implementazione AJAX, è necessario recuperare questo token e passarlo come parametro al server in modo che possa essere convalidato.

Passaggio 1: Ottieni il token

 var token = $('input[name="`__RequestVerificationToken`"]').val(); 

Passaggio 2: passare il token nella chiamata AJAX

 function registerStudent() { var student = { "FirstName": $('#fName').val(), "LastName": $('#lName').val(), "Email": $('#email').val(), "Phone": $('#phone').val(), }; $.ajax({ url: '/Student/RegisterStudent', type: 'POST', data: { __RequestVerificationToken:token, student: student, }, dataType: 'JSON', contentType:'application/x-www-form-urlencoded; charset=utf-8', success: function (response) { if (response.result == "Success") { alert('Student Registered Succesfully!') } }, error: function (x,h,r) { alert('Something went wrong') } }) }; 

Nota : il tipo di contenuto deve essere 'application/x-www-form-urlencoded; charset=utf-8' 'application/x-www-form-urlencoded; charset=utf-8'

Ho caricato il progetto su Github; puoi scaricarlo e provarlo.

https://github.com/lambda2016/AjaxValidateAntiForgeryToken