Estoy creando una aplicación de página única y estoy experimentando un problema con los tokens antifalsificación.
Sé por qué ocurre el problema, pero no sé cómo solucionarlo.
Me sale el error cuando sucede lo siguiente:
- El usuario que no ha iniciado sesión carga un cuadro de diálogo (con un token antifalsificación generado)
- El usuario cierra el diálogo.
- El usuario inicia sesión
- El usuario abre el mismo cuadro de diálogo.
- El usuario envía el formulario en el cuadro de diálogo
El token antifalsificación está destinado al usuario "" pero el usuario actual es "nombre de usuario"
La razón por la que esto sucede es porque mi aplicación es 100% de una sola página, y cuando un usuario inicia sesión con éxito a través de una publicación ajax /Account/JsonLogin
, simplemente cambio las vistas actuales con las "vistas autenticadas" devueltas desde el servidor pero no vuelvo a cargar el página.
Sé que esta es la razón porque si simplemente vuelvo a cargar la página entre los pasos 3 y 4, no hay ningún error.
Por lo tanto, parece que @Html.AntiForgeryToken()
en el formulario cargado aún se devuelve un token para el usuario anterior hasta que se vuelve a cargar la página.
¿Cómo puedo cambiar @Html.AntiForgeryToken()
para devolver un token para el nuevo usuario autenticado?
Inyecto un nuevo GenericalPrincipal
con una costumbre IIdentity
cada Application_AuthenticateRequest
vez que me @Html.AntiForgeryToken()
llaman HttpContext.Current.User.Identity
, de hecho, mi Identidad personalizada con la IsAuthenticated
propiedad establecida en verdadero y @Html.AntiForgeryToken
aún parece representar un token para el usuario anterior a menos que haga una recarga de la página.
fuente
Respuestas:
Esto sucede porque el token antifalsificación incorpora el nombre de usuario del usuario como parte del token cifrado para una mejor validación. Cuando llama por primera vez,
@Html.AntiForgeryToken()
el usuario no está conectado, por lo que el token tendrá una cadena vacía para el nombre de usuario, después de que el usuario inicie sesión, si no reemplaza el token antifalsificación, no pasará la validación porque el token inicial era para usuario anónimo y ahora tenemos un usuario autenticado con un nombre de usuario conocido.Tiene algunas opciones para resolver este problema:
Esta vez, deje que su SPA realice una POST completa y cuando la página se vuelva a cargar tendrá un token antifalsificación con el nombre de usuario actualizado incrustado.
Tenga una vista parcial con justo
@Html.AntiForgeryToken()
y justo después de iniciar sesión, haga otra solicitud AJAX y reemplace su token antifalsificación existente con la respuesta de la solicitud.Simplemente deshabilite la verificación de identidad que realiza la validación antifalsificación. Añadir lo siguiente a su Application_Start método:
AntiForgeryConfig.SuppressIdentityHeuristicChecks = true
.fuente
Para corregir el error, debe colocar la
OutputCache
Anotación de datos en laActionResult
página Obtener inicio de sesión como:fuente
Sucede muchas veces con mi aplicación, así que decidí buscarlo en Google.
¡Encontré una explicación simple sobre este error! ¡El usuario hace doble clic en el botón para iniciar sesión! Puedes ver a otro usuario hablando de eso en el siguiente enlace:
MVC 4 proporcionó el token antifalsificación para el usuario "" pero el usuario actual es "usuario"
¡Espero que ayude! =)
fuente
Tuve el mismo problema, y este truco sucio lo solucionó, al menos hasta que pueda solucionarlo de una manera más limpia.
...
fuente
El mensaje aparece cuando inicia sesión cuando ya está autenticado.
Este ayudante hace exactamente lo mismo que el
[ValidateAntiForgeryToken]
atributo.Retire el
[ValidateAntiForgeryToken]
atributo del controlador y coloque este método de ayuda en acción.Entonces, cuando el usuario ya esté autenticado, redirija a la página de inicio o, si no, continúe con la verificación del token antifalsificación válido después de esta verificación.
fuente
Tengo la misma excepción que ocurre la mayor parte del tiempo en el servidor de producción.
¿Por que sucede?
Ocurre cuando el usuario inicia sesión con credenciales válidas y una vez que inicia sesión y redirige a otra página, y después de presionar el botón Atrás se mostrará la página de inicio de sesión y nuevamente ingresó credenciales válidas esa vez se producirá esta excepción.
¿Cómo resolver?
Simplemente agregue esta línea y funcione perfecto, no recibirá un error.
fuente
Tuve un problema bastante específico pero similar dentro del proceso de registro. Una vez que el usuario hizo clic en el enlace de correo electrónico que se le envió, iniciará sesión y se lo enviará directamente a la pantalla de detalles de la cuenta para completar más información. Mi código fue:
Descubrí que la Vista de retorno ("AccountDetails") me estaba dando la excepción del token, supongo que porque la función ConfirmEmail estaba decorada con AllowAnonymous pero la función AccountDetails tenía ValidateAntiForgeryToken.
Cambiar el retorno a retorno RedirectToAction ("AccountDetails") resolvió el problema para mí.
fuente
Puede probar esto colocando un punto de interrupción en la primera línea de su acción Iniciar sesión (Obtener). Antes de agregar la directiva OutputCache, el punto de interrupción se alcanzaría en la primera carga, pero después de hacer clic en el botón Atrás del navegador no lo haría. Después de agregar la directiva, debe terminar con el punto de interrupción golpeado cada vez, por lo que AntiForgeryToken será el núcleo, no el vacío.
fuente
Tuve el mismo problema con una aplicación ASP.NET MVC Core de una sola página. Lo resolví configurando
HttpContext.User
todas las acciones del controlador que cambian las declaraciones de identidad actuales (ya que MVC solo hace esto para solicitudes posteriores, como se explica aquí ). Utilicé un filtro de resultados en lugar de middleware para agregar las cookies antiforgery a mis respuestas, lo que se aseguró de que solo se generaran después de que la acción MVC hubiera regresado.Controlador (Nota: estoy administrando usuarios con ASP.NET Core Identity):
Filtro de resultados para agregar cookies antiforgery:
Extracto de Startup.cs:
fuente
Tiene un problema con la validación de token antifalsificación en la tienda de Internet: los usuarios abren muchas pestañas (con productos) y después de iniciar sesión en una intenta iniciar sesión en otra y obtienen dicha AntiForgeryException. Entonces, AntiForgeryConfig.SuppressIdentityHeuristicChecks = true no me ayudó, así que usé un truco tan feo, tal vez sea útil para alguien:
Piense que sería genial si se pueden configurar las opciones de generación de tokens antifalsificación, para excluir el nombre de usuario o algo así.
fuente