signout mvc formsauthentication c# asp.net forms-authentication

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.