none
AntiForgeryToken en petición Ajax RRS feed

  • Pregunta

  • Buenas,

    Estoy tratando de realizar una petición vía ajax:

    // Capturo el token
    var token = $('input[name="__RequestVerificationToken"]').val();
    
    $.ajax({
    	type: 'post',
    	async: true,
    	url: 'http://la_url',
    	data: JSON.stringify({ codCurso: 'EC44' }),
    	dataType: 'json',
    	contentType: 'application/json; charset=UTF-8',
    	processData: false,
    	cache: 'false',
    	headers: { '__RequestVerificationToken': token },
    	success: fSuccess(),
    	error: fError()
    });

    En la vista tengo el helper @Html.AntiForgeryToken() dentro de la etiqueta del formulario, pero sucede que falla la petición y entra al método Application_Error del Global.asax, donde se obtiene el siguiente mensaje de error:

    The required anti-forgery form field "__RequestVerificationToken" is not present.

    También he intentado enviar el token como parte de los parámetros:

    $.ajax({
    	type: 'post',
    	async: true,
    	url: 'http://la_url',
    	data: JSON.stringify({ codCurso: 'EC44', '__RequestVerificationToken': token }),
    	dataType: 'json',
    	contentType: 'application/json; charset=UTF-8',
    	processData: false,
    	cache: 'false',
    	//headers: { '__RequestVerificationToken': token },
    	success: fSuccess(),
    	error: fError()
    });

    Pero el problema es el mismo.

    Mencionar también que el método del controlador al que estoy invocando tiene los decoradores [HttpPost] y [ValidateAntiForgeryToken]

    Por favor su apoyo, muchas gracias.



    • Editado eduar2083 lunes, 30 de julio de 2018 22:11
    lunes, 30 de julio de 2018 22:08

Todas las respuestas

  • Estuve investigando y es necesario agregar la siguiente clase y utilizar esta clase como decorador de la clase que contiene el método que se ejecuta en la peticón ajax:

    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
        public sealed class ValidateHeaderAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
        {
            public void OnAuthorization(AuthorizationContext filterContext)
            {
                if (filterContext == null)
                {
                    throw new ArgumentNullException("filterContext");
                }
    
                var httpContext = filterContext.HttpContext;
                var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName];
                var formToken = httpContext.Request.Headers["__RequestVerificationToken"];
    
                AntiForgery.Validate(cookie != null ? cookie.Value : null, formToken);
            }
        }
    Pero veo que siempre difiere el valor de la cookie con el valor del token del formulario.


    • Editado eduar2083 martes, 31 de julio de 2018 15:18
    martes, 31 de julio de 2018 15:17