El campo de formulario antifalsificación requerido "__RequestVerificationToken" no está presente Error en el registro del usuario

141

Estoy usando Membership.createla función de usuario, entonces ocurre el siguiente error,

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

¿Cómo puedo arreglar esto?

Hemant Soni
fuente

Respuestas:

218

Tienes [ValidateAntiForgeryToken]atributo antes de tu acción. También debe agregar @Html.AntiForgeryToken()su formulario.

desarrollador web
fuente
11
Tengo una página web que tiene el mismo problema pero todo está correcto. cual es el error
ConductedClever
@ConductedClever Debe comprobar cuidadosamente todo (campos, galletas) con el violinista y / o Firebug (herramientas del navegador dev), vistazo a este artículo: asp.net/web-api/overview/security/...
webdeveloper
@ConductedClever yo también. Eso es trabajo, pero rara vez aparece este error y no tengo idea ¿POR QUÉ?
QMaster
Tengo todo bien, en mis pruebas funciona, en la máquina de un cliente funcionó hasta hace poco, pero ahora da este error. No tengo ni idea de porqué. ¿Alguien tiene otras ideas que las que se enumeran aquí, por favor?
Andrei Dobrin
1
Html.AntiForgeryToken();No funciona !! Convirtiéndose en @Html.AntiForgeryToken()obras
FindOutIslamNow
78

En mi caso, tuve esto en mi web.config:

<httpCookies requireSSL="true" />

Pero mi proyecto estaba configurado para no usar SSL. Al comentar esa línea o configurar el proyecto para usar siempre SSL, se resolvió.

Justin Skiles
fuente
3
En mi caso, web.config tenía requireSSL pero había enlaces IIS para los puertos 80 y 443, por lo que los usuarios que escribían https obtenían el comportamiento correcto y los usuarios que escribían http obtenían este error, poniendo una regla de reescritura para obligar a todos a https: / / {HTTP_HOST} / {R: 1} lo arregló
user1069816 el
Gracias 😃 En mi caso IIShubo un enlace ( https » EmptyHostName » IP » 443) pero no hubo un enlace para ( https » www.mysite.com » IP » 443). Así que agregué un nuevo enlace con un nombre de host no vacío para httpseso era igual al dominio y resolvió el problema. He reescrito la configuración IISpara forzar http 2 httpstambién.
RAM
61

Me gusta esto:

El controlador

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
     ...
     Code Block
     ...
}

La vista:

@using(Html.BeginForm())
{
     @Html.AntiForgeryToken()
     <input name="..." type="text" />
     // rest
}
Subrata Sarkar
fuente
Intente usar solo en HTML
Subrata Sarkar
41

También asegúrese de evitar no usar [ValidateAntiForgeryToken] en [HttpGet].

  [HttpGet]
  public ActionResult MethodName()
  {
  ..
  }
Fan de Haiping
fuente
1
¡Esta respuesta complementó a las demás y resolvió mi problema! Gracias
Lucas
1
Esta respuesta supone que no está guardando ningún dato enviado (que no debería estar en un HttpGet). Si es así, aún necesita la protección XSRF que proporciona [ValidateAntiForgeryToken].
thelem
9

Recibirá el error incluso cuando las Cookies no estén habilitadas.

Vijaychandar
fuente
2
Buen golpe Estaba usando Internet Explorer. El uso del navegador Chrome me resolvió el problema
FindOutIslamNow
Esto resolvió mi problema también. habilitando cookies en google chrome. Gracias
El método científico
7

Otra cosa que puede causar esto (solo me encontré con esto) es la siguiente: si por alguna razón deshabilita todos los campos de entrada en su formulario. deshabilitará el campo de entrada oculto que contiene su token de verificación. cuando el formulario se regrese, el valor del token faltará y generará el error que falta. Entonces, lo que debe hacer es volver a habilitar el campo de entrada que contiene el token de verificación y todo estará bien.

romano
fuente
6

Otra posibilidad para quienes cargamos archivos como parte de la solicitud. Si la longitud del contenido excede <httpRuntime maxRequestLength="size in kilo bytes" /> y está utilizando tokens de verificación de solicitud, el navegador muestra el 'The required anti-forgery form field "__RequestVerificationToken" is not present'mensaje en lugar del mensaje de longitud excedida de la solicitud.

Establecer maxRequestLength en un valor lo suficientemente grande como para atender la solicitud cura el problema inmediato, aunque admitiré que no es una solución adecuada (queremos que el usuario sepa el verdadero problema del tamaño del archivo, no el de los tokens de verificación de solicitud que faltan).

GeoffM
fuente
5

Asegúrese en su controlador de que tiene su atributo http como:

[HttpPost]

también agregue el atributo en el controlador:

[ValidateAntiForgeryToken]

En su formulario en su vista tiene que escribir:

@Html.AntiForgeryToken();

Tenía Html.AntiForgeryToken (); sin el signo @ mientras estaba en un bloque de código, no dio un error en Razor pero sí en tiempo de ejecución. Asegúrese de mirar el signo @ de @ Html.Ant .. si falta o no

juFo
fuente
5

En mi caso, tenía este javascript en el formulario de envío:

$('form').submit(function () {
    $('input').prop('disabled', true);
});

Esto eliminaba el RequestVerificationToken oculto del formulario que se envía. Lo cambié a:

$('form').submit(function () {
    $('input[type=submit]').prop('disabled', true);
    $('input[type=text]').prop('readonly', true);
    $('input[type=password]').prop('readonly', true);
});

... y funcionó bien.

Sean
fuente
¿Cómo notó que la anti clave se vio afectada cuando deshabilitó las entradas?
Cer
1
@Cer: si está preguntando cómo me di cuenta, verifiqué la solicitud con Fiddler y contesté que la clave no se estaba enviando. Lo que leí que envía HTML no incluirá controles deshabilitados. Así que lo cambié readonlyy excluí los controles ocultos. Parece funcionar bien.
Sean
3

Si alguien experimenta el error por la misma razón por la que lo experimento, aquí está mi solución:

si tuvieras Html.AntiForgeryToken();

cámbielo a @Html.AntiForgeryToken()

Winnifred
fuente
2

En mi caso el dominio incorrecto en web.config para cookies fue el motivo:

<httpCookies domain=".wrong.domain.com" />
Michael Logutov
fuente
yeep! si en la computadora local escribe <httpCookies domain = "localhost" />, entonces solo en la computadora local las cookies funcionarán y si intenta abrir su sitio en otra máquina, ingresará su ip (fe 192.168.1.43) que no funcionará porque buscando "localhost"
user3419036
2

En mi caso fue debido a la adición requireSSL=truede httpcookiesen webconfig que hizo que el funcionamiento de la parada AntiForgeryToken. Ejemplo:

<system.web>
  <httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>

Para hacer ambas cosas requireSSL=truey @Html.AntiForgeryToken()trabajar, agregué esta línea dentro Application_BeginRequestdeGlobal.asax

    protected void Application_BeginRequest(object sender, EventArgs e)
  {
    AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
  }
Ege Bayrak
fuente
2

Recibí este error en Chrome con inicio de sesión predeterminado para ASP.NET con cuentas de usuario individuales

.cshtml:

@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    <h4>Use a local account to log in.</h4>

Controlador:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)

Resuelto borrando los datos del sitio para el sitio:

ingrese la descripción de la imagen aquí

Ogglas
fuente
Ok, ha funcionado. Pero esto sucede una y otra vez. En Firefox, el mismo proyecto se ejecuta correctamente. ¿Que puedo hacer?
Can Ürek
@ CanÜrek ¿Tiene varios proyectos / sitios diferentes con el mismo dominio? Ex localhost, app.site.com y app2.site.com, etc. Normalmente sucede por esto.
Ogglas
0

En mi solución EPiServer en varios controladores había un atributo ContentOutputCache en la acción Index que aceptaba HttpGet. Cada vista para esas acciones contenía un formulario que se publicaba en una acción HttpPost en el mismo controlador o en uno diferente. Tan pronto como eliminé ese atributo de todas esas acciones del Índice, el problema desapareció.

Goran Sneperger
fuente
0

Porque esto surge con la primera búsqueda de esto:

Tuve este problema solo en Internet Explorer y no pude averiguar cuál era el problema. En pocas palabras, no estaba guardando la porción de cookie del Token porque nuestro (sub) dominio tenía un guión bajo. Trabajó en Chrome pero a IE / Edge no le gustó.

kevhann80
fuente
0

Todas las otras respuestas aquí también son válidas, pero si ninguna de ellas resuelve el problema, también vale la pena verificar que los encabezados reales se estén pasando al servidor.

Por ejemplo, en un entorno de carga equilibrada detrás de nginx, la configuración predeterminada es eliminar el encabezado __RequestVerificationToken antes de pasar la solicitud al servidor, vea: el proxy inverso nginx simple parece eliminar algunos encabezados

Doug
fuente
0

A veces está escribiendo un método de acción de formulario con una lista de resultados. En este caso, no puede trabajar con un método de acción. Por lo tanto, debe tener dos métodos de acción con el mismo nombre. Uno con [HttpGet]y otro con[HttpPost] atributo.

En su [HttpPost]método de acción, establezca el [ValidateAntiForgeryToken]atributo y también coloque @Html.AntiForgeryToken()su formulario html.

Masoud Darvishian
fuente
0

En mi caso, recibí este error al hacer una publicación AJAX, resultó que el valor __RequestVerificationToken no se pasaba en la llamada. Tuve que encontrar manualmente el valor de este campo y establecerlo como una propiedad en el objeto de datos que se envía al punto final.

es decir data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();


Ejemplo

HTML

  <form id="myForm">
    @Html.AntiForgeryToken()

    <!-- other input fields -->

    <input type="submit" class="submitButton" value="Submit" />
  </form>

Javascript

$(document).on('click', '#myForm .submitButton', function () {
  var myData = { ... };
  myData.__RequestVerificationToken = $('#myForm input[name="__RequestVerificationToken"]').val();

  $.ajax({
    type: 'POST',
    url: myUrl,
    data: myData,
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',
    dataType: 'json',
    success: function (response) {
      alert('Form submitted');
    },
    error: function (e) {
      console.error('Error submitting form', e);
      alert('Error submitting form');
    },
  });
  return false; //prevent form reload
});

Controlador

    [HttpPost]
    [Route("myUrl")]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> MyUrlAsync(MyDto dto)
    {
        ...
    }
demoncodemonkey
fuente
De hecho, si define la estructura de su clase MyDto, será muy útil
Chandan Kumar
Bueno, no estoy seguro de que realmente sea muy útil y el código de ejemplo ya no existe, así que digamospublic class MyDto { public bool Whatever { get; set; } }
demoncodemonkey
-1

Me gustaría compartir el mío, he estado siguiendo este tutorial anti falsificación usando asp.net mvc 4 con angularjs, pero arroja una excepción cada vez que solicito usar $ http.post y descubrí que la solución es simplemente agregar 'X- Solicitado con ':' XMLHttpRequest ' a los encabezados de $ http.post, porque parece que (filterContext.HttpContext.Request.IsAjaxRequest()) no lo reconoce como ajax y aquí está mi código de ejemplo.

App.js

var headers = { 'X-Requested-With': 'XMLHttpRequest', 'RequestVerificationToken': $scope.token, 'Content-Type': 'application/json; charset=utf-8;' };

$http({ method: 'POST', url: baseURL + 'Save/User', data: JSON.stringify($scope.formData), headers: headers }).then(function (values) { alert(values.data); }).catch(function (err) { console.log(err.data); });


SaveController

[HttpPost] [MyValidateAntiForgeryToken] public ActionResult User(UserModel usermodel) { ....

Ran Lorch
fuente