c# - mvc - Cuando se intenta cerrar la sesión, el token anti-falsificación proporcionado fue para el usuario "XXXX", pero el usuario actual es ""
asp.net mvc 6 (2)
La respuesta de @cem fue muy útil para mí y agregué un pequeño cambio para incluir el escenario de llamadas ajax con sesión antiforgerytoken y caducada.
public void OnException(ExceptionContext filterContext)
{
var exception = filterContext.Exception as HttpAntiForgeryException;
if (exception == null) return;
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.ExceptionHandled = true;
}
else
{
var routeValues = new RouteValueDictionary
{
["controller"] = "Account",
["action"] = "Login"
};
filterContext.Result = new RedirectToRouteResult(routeValues);
filterContext.ExceptionHandled = true;
}
}
... y en el lado del cliente puede agregar un controlador de errores ajax global para redirigir a la pantalla de inicio de sesión ...
$.ajaxSetup({
error: function (x) {
if (x.status === 403) {
window.location = "/Account/Login";
}
}
});
Tengo una aplicación MVC 4 y tengo problemas cuando caduca la sesión de formularios y luego el usuario intenta cerrar la sesión.
Ex. el tiempo de espera se establece en 5 min. El usuario inicia sesión. El usuario no hace nada durante 10 min. El usuario hace clic en el enlace LogOff. El usuario obtiene un error: "El token de anti-falsificación proporcionado fue para el usuario" XXXX ", pero el usuario actual es" "."
Luego, el usuario tuvo que pasar por un poco de gimnasia para evitar esto y poder volver a iniciar sesión y luego volver a cerrar la sesión (la sesión se está utilizando para cerrar su tarjeta de tiempo para el día).
Creo que entiendo por qué sucede esto ... pero no estoy seguro de cómo solucionarlo.
EDITAR: la razón por la que creo que esto está sucediendo es porque originalmente cuando se carga la página, se genera el token de AntiForgery para el usuario que ha iniciado sesión actualmente. Pero luego, cuando la sesión expira y tratan de navegar a la página de cierre de sesión, el usuario actual es "" en lugar del usuario real. Como tal, hay una discrepancia y el error se representa.
En realidad, puedes manejarlo con IExceptionFilter
, que redirigirá a /Account/Login
public class HandleAntiForgeryError : ActionFilterAttribute, IExceptionFilter
{
#region IExceptionFilter Members
public void OnException(ExceptionContext filterContext)
{
var exception = filterContext.Exception as HttpAntiForgeryException;
if (exception != null)
{
var routeValues = new RouteValueDictionary();
routeValues["controller"] = "Account";
routeValues["action"] = "Login";
filterContext.Result = new RedirectToRouteResult(routeValues);
filterContext.ExceptionHandled = true;
}
}
#endregion
}
[HandleAntiForgeryError]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
}
También puede usar [HandleError(ExceptionType=typeof(HttpAntiForgeryException)...]
pero requiere customErrors On.