presente formulario está campo antifalsificación __requestverificationtoken c# jquery asp.net-mvc cookies antiforgerytoken

c# - formulario - La cookie anti-falsificación requerida "__RequestVerificationToken" no está presente



__requestverificationtoken ajax (5)

Además de la excelente respuesta de rism, otra posible razón para encontrar este error es que su navegador o el complemento del navegador está impidiendo que se configuren las cookies .

Mi sitio web está generando esta excepción aproximadamente 20 veces al día, generalmente el formulario funciona bien, pero hay casos en que ocurre este problema y no sé por qué es tan aleatorio.

Esta es una excepción registrada por elmah

500 HttpAntiForgery La cookie anti-falsificación requerida __RequestVerificationToken "no está presente.

Pero la forma es enviar el token como se muestra en el registro XML por elmah

<form> <item name="__RequestVerificationToken"> <value string="DNbDMrzHmy37GPS6IFH-EmcIh4fJ2laezIrIEev5f4vOhsY9T7SkH9-1b7GPjm92CTFtb4dGqSe2SSYrlWSNEQG1MUlNyiLP1wtYli8bIh41"/> </item> <item name="toPhone"> <value string="XXXXXX"/> </item> <item name="smsMessage"> <value string="xxxxxxxx"/> </item> </form>

Este es mi método en el controlador que usa el atributo de datos para verificar si el token es válido o no

[HttpPost] [ValidateAntiForgeryToken] public async Task<JsonResult> Send(SMSModel model) { // my code goes here }

Este es mi formulario en la vista.

@using (Html.BeginForm("Send", "SMS", FormMethod.Post, new { @class = "form-sms", autocomplete = "off" })) { @Html.AntiForgeryToken() <div class="row"> <div class="col-md-12"> <div class="form-group"> <div class="input-group"> <div class="input-group-addon">+53</div> @Html.TextBoxFor(m => m.toPhone, new { @class = "form-control", placeholder = "teléfono", required = "required", type = "tel", maxlength = 8 }) </div> </div> </div> </div> <div class="form-group" style="position:relative"> <label class="sr-only" for="exampleInputEmail3">Message (up to 135 characters)</label> @Html.TextAreaFor(m => m.smsMessage, new { rows = 4, @class = "form-control", placeholder = "escriba aquí su mensaje", required = "required", maxlength = "135" }) <span class="char-count">135</span> </div> if (ViewBag.Sent == true) { <div class="alert alert-success alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button> <strong>Su mensaje ha sido enviado <span class="hidden-xs">satisfactoriamente</span></strong> </div> } if (ViewBag.Error == true) { <div class="alert alert-danger alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button> <strong>Error:</strong> Por favor revise el número de teléfono. </div> } <div class="errorToMany"></div> <button type="submit" class="btn btn-default btn-block">Enviar SMS</button> }

Y así es como publico mis datos utilizando AJAX.

$(''form.form-sms'').submit(function (event) { $.ajax({ url: $(this).attr("action"), type: "POST", data: $(this).serializeArray(), beforeSend: function (xhr) { $(''.btn-default'').attr("disabled", true); $(''.btn-default'').html("Enviando...") }, success: function (data, textStatus, jqXHR) { if (data[0] == false && data[1] == "1") { some code } else { location.reload(); } }, error: function (jqXHR, textStatus, errorThrown) { } }); return false; });

El formulario funciona bien la mayoría de las veces, pero este error sigue ocurriendo y no sé por qué, he revisado otras preguntas aquí en Stack Overflow pero nada funciona para mí.

Para una explicación más detallada sobre cómo publico los datos.

Este formulario para enviar SMS tiene los campos Para Número y Mensaje. Cuando un usuario hace clic en el botón enviar, la función AJAX toma el control y lo publica serializando los datos de campo del formulario, cuando mi función en el controlador finaliza y devuelve el resultado JSON que indica que todo salió bien, el método AJAX vuelve a cargar la página para que el usuario tenga éxito. mensaje.

Cualquier idea de lo que podría estar causando este problema.


Casi suena como si las cosas estuvieran funcionando como se esperaba.

La forma en que funciona el asistente de falsificación @Html.AntiForgeryToken() es inyectando un campo de formulario oculto llamado __RequestVerificationToken en la página Y también establece una cookie en el navegador.

Cuando se devuelve el formulario, se comparan los dos y si no coinciden o falta la cookie, se genera el error.

Por lo tanto, no importa que Elmah registre que el formulario está enviando __RequestVerificationToken . Siempre lo será, incluso en el caso de un ataque CSRF , porque esto es simplemente el campo de formulario oculto.

<input name="__RequestVerificationToken" type="hidden" value="DNbDMrzHmy37GPS6IFH-EmcIh4fJ2laezIrIEev5f4vOhsY9T7SkH9-1b7GPjm92CTFtb4dGqSe2SSYrlWSNEQG1MUlNyiLP1wtYli8bIh41" />

Por otro lado, el mensaje de error dice que la COOKIE correspondiente no se está enviando:

500 HttpAntiForgery La cookie anti-falsificación requerida __RequestVerificationToken "no está presente.

Básicamente, alguien / algo está reproduciendo el formulario sin hacer la solicitud original para obtener la cookie. Como tales, tienen el campo de formulario oculto __RequestVerificationToken pero NO la cookie para verificarlo.

Así que parece que las cosas están funcionando como deberían. Verifique sus registros: números de IP, referencias, etc. Es posible que esté bajo ataque o que esté haciendo algo extraño o con errores al redirigir el contenido de su formulario. Como se referrers anteriormente, los referrers son un buen lugar para comenzar para este tipo de error, asumiendo que esto no se está falsificando.

También tenga en cuenta que según MDN

location.reload();

El método Location.reload () vuelve a cargar el recurso desde la URL actual. Su parámetro único opcional es un booleano, que, cuando es verdadero, hace que la página siempre se vuelva a cargar desde el servidor. Si es falso o no está especificado, el navegador puede volver a cargar la página desde su caché .

Si es así, en ocasiones se carga desde la memoria caché, entonces podría terminar con un POST que tenga el token de la página anterior pero no la cookie.

Así que prueba:

location.reload(true);


Se encontró con un problema similar recientemente. De hecho, faltaba la cookie anti-falsificación, así que (como han señalado otros)

  1. el servidor no agregó la cookie para solicitar, o
  2. El navegador lo rechazó.

En mi caso, fue el servidor: no estaba usando SSL en el entorno local, pero en web.config tenía la siguiente línea:

<httpCookies requireSSL="True"/>

La solución en este caso es cambiar a SSL o mantener el valor establecido en ''Falso'' para el entorno local.


Tal vez quiera echar un vistazo a esta pregunta. El token de cookie antirrobo y el token de campo de formulario no coinciden en MVC 4

Es posible que este sea un problema de tiempo de espera. Básicamente, cuando se agota el tiempo de espera, la cookie no se almacena porque el usuario iis en el que se está ejecutando el sitio no tiene el acceso adecuado. Para mí, cambié el grupo de aplicaciones para cargar el perfil de usuario y esto pareció solucionarlo.


Tuve el mismo problema en el navegador de borde.

He solucionado este problema por la configuración del navegador de cambios.

Siga las instrucciones para solucionar el problema:

Vaya a Configuración> Ver configuración avanzada> Cookies> Cambie a "No bloquear cookies".

Cierre el navegador y compruebe.

Pensé, podría ayudar a alguien.