c# - mvc - Página.Usuario.Identidad.IsAutenticado sigue siendo verdadero después de FormsAuthentication.SignOut()
formsauthentication mvc 5 (6)
Tengo una página que cuando presiona ''cerrar sesión'' se redirigirá a la página login.aspx
que tiene un método Page_Load
que llama a FormsAuthentication.SignOut()
.
La página maestra muestra el enlace ''cerrar sesión'' en la parte superior derecha de la pantalla y lo muestra con la condición de que Page.User.Identity.IsAuthenticated
sea true
. Sin embargo, después de recorrer el código, este método de registro no establece automáticamente IsAuthenticated
en false
cual es bastante molesto, ¿alguna idea?
Actualizar
Recibí comentarios de que mi respuesta no funcionaba con mucha gente. Escribí esta respuesta en 2011 después de desgarrar mi oído. Así que estoy bastante seguro de que resolvió el problema.
Empecé a investigar este problema de hace 6 años y llegué a esta solución, que creo que podría ser la forma correcta de eliminar las cookies, que es mediante la creación de ellas nuevamente, pero con fechas expiradas.
Esto funciona para mí
public virtual ActionResult LogOff()
{
FormsAuthentication.SignOut();
foreach (var cookie in Response.Cookies.AllKeys)
{
Response.Cookies.Remove(cookie);
}
return RedirectToAction(MVC.Home.Index());
}
¿Por qué está ejecutando el código de cierre de sesión en el login.aspx?
Ponga este código en eg logout.aspx:
FormsAuthentication.SignOut()
Session.Abandon()
FormsAuthentication.RedirectToLoginPage()
HttpContext.Current.ApplicationInstance.CompleteRequest()
return
IsAuthenticated será falso en login.aspx. El código de inicio de sesión y el de salida ahora están separados: responsabilidad única.
En su método login.aspx Page_Load:
if (!this.IsPostBack)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
FormsAuthentication.SignOut();
Response.Redirect(Request.RawUrl);
}
}
Recuerdo que tuve un problema similar y creo que lo resolví al caducar la cookie de autenticación de formularios al momento de cerrar la sesión:
FormsAuthentication.SignOut();
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);
Una persona solo se autentica una vez por solicitud. Una vez que ASP.NET determina si están autenticados o no, no cambia para el resto de esa solicitud.
Por ejemplo, cuando alguien inicia sesión. Cuando configura los formularios auth cookie indicando que están conectados, si verifica si están autenticados en esa misma solicitud, devolverá false
, pero en la próxima solicitud, devolverá true
Lo mismo sucede cuando desconectas a alguien. Todavía están autenticados mientras dure esa solicitud, pero en el siguiente ya no se autenticarán. Por lo tanto, si un usuario hace clic en un enlace para cerrar la sesión, debe cerrar la sesión y luego redireccionar a la página de inicio de sesión.
Page.User.Identity.IsAuthenticated
obtiene su valor de Page.User
(obviamente), que desafortunadamente es de solo lectura y no se actualiza cuando llamas a FormsAuthentication.SignOut()
.
Afortunadamente, Page.User
extrae su valor de Context.User
que se puede modificar:
// HttpContext.Current.User.Identity.IsAuthenticated == true;
FormsAuthentication.SignOut();
HttpContext.Current.User =
new GenericPrincipal(new GenericIdentity(string.Empty), null);
// now HttpContext.Current.User.Identity.IsAuthenticated == false
// and Page.User.Identity.IsAuthenticated == false
Esto es útil cuando cierra la sesión del usuario actual y desea responder con la página real sin hacer una redirección. Puede verificar IsAuthenticated
donde lo necesite dentro de la misma solicitud de página.