asp.net - example - csrf token c#
El token anti-falsificación estaba destinado a un usuario diferente basado en reclamaciones (5)
Está devolviendo una View
, en lugar de llamar a RedirectToAction()
. Entonces, lo que sucede es que la vista se ejecuta en el contexto de la solicitud de cierre de sesión, donde el usuario todavía está conectado. No se cerrará la sesión hasta que la solicitud finalice.
Entonces prueba
public ActionResult Logout()
{
SignInManager.Logout();
return RedirectToAction("Index", "Home");
}
Estoy trabajando en una función de cierre de sesión en la aplicación en la que estamos utilizando el inicio de sesión de Identidad de ASP.NET. Puedo iniciar sesión correctamente, pero cuando cierro sesión y luego intento iniciar sesión nuevamente, aparece el siguiente mensaje:
The provided anti-forgery token was meant for a different claims-based user than the current user.
Aquí está mi código de cierre de sesión:
public ActionResult Logout()
{
SignInManager.Logout();
return View("Index");
}
**SignInManager.cs**
public void Logout()
{
AuthenticationManager.SignOut();
}
Después de que el usuario presione el botón de cierre de sesión, irá a la pantalla de inicio de sesión. La url todavía dice " http://localhost:8544/Login/Logout ". Ya que estamos en la pantalla de inicio de sesión tal vez debería decir " http://localhost:8544/Login ".
He estado recibiendo este mismo error en el inicio de sesión durante mucho tiempo, pero no he podido averiguar por qué. Finalmente lo encontré, así que lo estoy publicando aquí (aunque es una causa ligeramente diferente) en caso de que alguien más lo tenga.
Este fue mi código:
//
// GET: /login
[OutputCache(NoStore = true, Location = System.Web.UI.OutputCacheLocation.None)]
public ActionResult Login()
{
return View();
}
//
// POST: /login
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
if (!ModelState.IsValid)
{
return View(model);
}
//etc...
Esto funcionó bien para el 99,99% de los inicios de sesión, pero de vez en cuando recibí el error mencionado anteriormente, aunque no pude reproducirlo hasta ahora.
El error solo ocurre cuando alguien hace clic en el botón de inicio de sesión dos veces en rápida sucesión. Sin embargo, si elimino la línea AuthenticationManager.SignOut
en la acción de Login
, entonces está bien. No estoy seguro de por qué coloco esa línea allí, pero está causando el problema y al eliminarla se soluciona el problema.
Lo que funcionó para mí fue cambiar el orden de los middlewares utilizados. Agregue primero app.UseAuthentication()
y luego las cosas antiforgery. Así es como lo hice:
app.UseAuthentication();
app.Use(next => ctx =>
{
var tokens = antiforgery.GetAndStoreTokens(ctx);
ctx.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken,
new CookieOptions() { HttpOnly = false });
return next(ctx);
});
Hacerlo al revés crea un token que no está destinado a usuarios autenticados.
Prueba esto:
public ActionResult Logout()
{
AuthenticationManager.SignOut();
Session.Abandon();
return RedirectToAction("Index");
}
Eso volverá a cargar su página de inicio de sesión que le proporcionará un nuevo token CSRF.
Prueba esto:
public ActionResult Login(string modelState = null)
{
if (modelState != null)
ModelState.AddModelError("", modelState );
return View();
}
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model)
{
AuthenticationManager.SignOut();
return RedirectToAction("Login", "Controller", new { modelState = "MSG_USER_NOT_CONFIRMED" });
}