incluir antiforgerytoken en ajax publicar ASP.NET MVC

Estoy teniendo problemas con AntiForgeryToken con ajax. Estoy usando ASP.NET MVC 3. Probé la solución en llamadas jQuery Ajax y Html.AntiForgeryToken () . Usando esa solución, el token ahora está siendo pasado:

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) { ... } }); 

Cuando [ValidateAntiForgeryToken] atributo [ValidateAntiForgeryToken] solo para ver si los datos (con el token) se pasan como parámetros al controlador, puedo ver que se están transfiriendo. Pero, por alguna razón, el A required anti-forgery token was not supplied or was invalid. el mensaje aún aparece cuando devuelvo el atributo.

¿Algunas ideas?

EDITAR

El antiforgerytoken se genera dentro de un formulario, pero no estoy usando una acción de envío para enviarlo. En cambio, estoy obteniendo el valor del token usando jquery y luego tratando de ajax publicar eso.

Aquí está el formulario que contiene el token y está ubicado en la página maestra superior:

 
@Html.AntiForgeryToken()

Ha especificado incorrectamente el contentType a application/json .

Aquí hay un ejemplo de cómo esto podría funcionar.

Controlador:

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

Ver:

 @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

Otro enfoque (menos javascript), que lo hice, es algo como esto:

Primero, 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)); } 

eso devolverá una cadena

 __RequestVerificationToken:"P5g2D8vRyE3aBn7qQKfVVVAsQc853s-naENvpUAPZLipuw0pa_ffBf9cINzFgIRPwsf7Ykjt46ttJy5ox5r3mzpqvmgNYdnKc1125jphQV0NnM5nGFtcXXqoY3RpusTH_WcHPzH4S4l1PmB8Uu7ubZBftqFdxCLC5n-xT0fHcAY1" 

para que podamos usarlo así

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

¡Y parece funcionar!

¡es tan simple! cuando usa @Html.AntiForgeryToken() en su código html significa que el servidor ha firmado esta página y cada solicitud que se envía al servidor desde esta página en particular tiene un letrero que no permite el envío de una solicitud falsa por parte de los hackers. entonces, para que el servidor autentique esta página, debe seguir dos pasos:

1. Enviar un parámetro llamado __RequestVerificationToken y obtener sus códigos de uso de valor a continuación:

  

por ejemplo, tomar una llamada 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, }); 

y el paso 2 simplemente decora tu método de acción por [ValidateAntiForgeryToken]



         función DeletePersonel (id) {

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

                 $ .ajax ({
                     tipo: 'POST',
                     url: '/ Personel / Delete /' + id,
                     datos: datos,
                     caché: falso,
                     processData: falso,
                     contentType: falso,
                     éxito: función (resultado) {

                     }
                 });

         }
    

         clase estática pública HtmlHelper
         {
             cadena estática pública GetAntiForgeryToken ()
             {
                 System.Text.RegularExpressions.Match value = System.Text.RegularExpressions.Regex.Match (System.Web.Helpers.AntiForgery.GetHtml (). ToString (), "(?: Value = \") (. *) (? : \ ")");
                 if (value.Success)
                 {
                     valor de retorno. Grupos [1] .Valor;
                 }
                 regreso "";
             }
         }

Sé que esta es una vieja pregunta. Pero agregaré mi respuesta de todos modos, podría ayudar a alguien como yo.

Si no desea procesar el resultado de la acción posterior del controlador, como llamar al método LoggOff del controlador de Accounts , podría hacer la siguiente versión de la respuesta de @DarinDimitrov:

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

Intenté mucho workarrounds y ninguno de ellos funcionó para mí. La excepción fue “El campo de formulario antifalsificación requerido” __RequestVerificationToken “.

Lo que me ayudó fue cambiar de .ajax a .post:

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

En Asp.Net MVC cuando usa @Html.AntiForgeryToken() Razor crea un campo de entrada oculto con el nombre __RequestVerificationToken para almacenar tokens. Si desea escribir una implementación de AJAX, tiene que obtener este token y pasarlo como un parámetro al servidor para que pueda ser validado.

Paso 1: obtener la ficha

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

Paso 2: Pase el token en la llamada 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 : El tipo de contenido debe ser 'application/x-www-form-urlencoded; charset=utf-8' 'application/x-www-form-urlencoded; charset=utf-8'

He subido el proyecto a Github; puedes descargarlo y probarlo.

https://github.com/lambda2016/AjaxValidateAntiForgeryToken