El campo de formulario antifalsificación "__RequestVerificationToken" no está presente


Cuando estás desarrollando una aplicación web MVC puede producirse el siguiente error:

El campo de formulario antifalsificación "__RequestVerificationToken" no está presente

El campo antifalsificación al que se refiere el error nos permite evitar los peligros de que otra aplicación de terceros haga solicitudes a nuestro métodos cuando no debería.

El error sucede cuando se ha agregado el atributo [ValidateAntiForgeryToken] a la Action que se está llamando en el Controller.

1. Solución 1: Hay que agregar:

@Html.AntiForgeryToken()

No te olvides de agregar el arroba.

2. Solución 2: Validar manualmente el campo de formulario antifalsificación. En mi caso, la solución 1 no funcionaba. Hay que quitar el atributo [ValidateAntiForgeryToken], y evaluar el token de forma manual, es decir obtener el token desde el request de la solicitud, obtener el valor y validar.

Dejo como ejemplo la función que podemos agregar en un Controller genérico que los demás Controller pueden heredar y esta función utilizarla en los métodos que necesiten implementar la validación.

        public void ValidateRequestHeader(HttpRequestBase request)
        {
            string cookieToken = "";
            string formToken = "";

            string tokenHeader = HttpContext.Request.Headers.Get("RequestVerificationToken");

            string[] tokens = tokenHeader.Split(':');

            if (tokens.Length == 2)
            {
                cookieToken = tokens[0].Trim();
                formToken = tokens[1].Trim();
            }

            AntiForgery.Validate(cookieToken, formToken);
        }

Comentarios