OWIN – Authentication.SignOut () no parece eliminar la cookie

Tengo algunos problemas con la autenticación de OWIN Cookie. Tengo un sitio .Net que tiene algunas páginas MVC que utiliza autenticación de cookies y recursos WebAPI protegidos por un token portador.

Cuando cierro la sesión, elimino el token de acceso en el cliente, por lo que las solicitudes posteriores de la API no tendrán el token en el encabezado y, por lo tanto, no se autenticará. Esta parte está bien.

De la misma manera, también me gustaría cerrar la sesión para eliminar la cookie utilizada por las páginas de MVC. Hice lo siguiente en el servidor:

[Route("Logout")] public IHttpActionResult Logout() { var ctx = Request.GetOwinContext(); var authenticationManager = ctx.Authentication; authenticationManager.SignOut(); return Ok(); } 

Sin embargo, después de cerrar la sesión, todavía puedo visitar la página MVC protegida, aunque supuestamente la llamada de Logout habría borrado la cookie.

Parece tan simple, así que podría haberme perdido algo.

Gracias,

Tuve un problema similar en los últimos días. En lugar de

 Request.GetOwinContext().Authentication.authenticationManager.SignOut(); 

Use UNO (y solo uno) de estos:

 Request.GetOwinContext().Authentication.SignOut(); Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie); HttpContext.Current.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie); 

Este artículo explica por qué sus cookies no se eliminan: http://dotnet.dzone.com/articles/catching-systemwebowin-cookie

Sé que mi respuesta no está basada en la mayoría de las investigaciones, pero a decir verdad, no pude encontrar POR QUÉ mis ejemplos de códigos proporcionados funcionan para mí. Solo sé que System.Web arruina las cookies de Owins si lo hace SignOut () de otra manera.

Esto funcionó para mí. Tíralo a un controlador cuando quieras invalidar la cookie. En particular, utilicé esto para actualizar las funciones del usuario para que el usuario no tenga que desconectarse manualmente y volver a conectarse para arreglar los menús que se cargan en @if(User.IsInRole("Admin")){...} . Espero que esto ayude a alguien, me tomó un tiempo resolver esto.

  var updatedUser = await UserManager.FindByNameAsync(User.Identity.Name); var newIdentity = await updatedUser.GenerateUserIdentityAsync(UserManager); AuthenticationManager.SignOut(); AuthenticationManager.SignIn(newIdentity); 

Seguí toda la solución anterior pero confundí al final porque el usuario no cerró la sesión. Finalmente mi problema resuelto por:

 Request.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie); FederatedAuthentication.SessionAuthenticationModule.SignOut(); 

Como utilicé SessionAuthenticationModule para mantener las reclamaciones, luego de cerrar la sesión, el usuario podría usar la aplicación debido a las cookies existentes de FedAut.

  AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); FormsAuthentication.SignOut(); Session.Abandon(); 

Acerca de ASP .Net MVC Logout no funciona: –

Tuve un problema cuando la aplicación alojada en IIS en modos de producción no funcionaba correctamente con Chrome

a pesar de que funcionó correctamente mientras usaba Visual Studio Dev hosting en todos los navegadores, en modo de producción en IE

Tuve problemas en Startup.Auth.CS. Asegúrate de que las configuraciones duplicadas no estén disponibles para las siguientes cosas

  app.CreatePerOwinContext(ApplicationUserManager.Create); app.UseCookieAuthentication((new CookieAuthenticationOptions(.....)) 

Tengo esto para trabajar. Esto es lo que hice:

Cuando llamé a la acción Cerrar sesión arriba, utilicé Fiddler ya que todavía estaba probando la función de cierre de sesión. Puse un punto de interrupción dentro y sí, el método se invoca con éxito. Llama a authenticationManager.SignOut () sin embargo, mi página protegida todavía funciona.

Entonces, en lugar de usar Fiddler, decidí poner el código en el cliente:

  var token = sessionStorage.getItem(tokenKey); var headers = {}; if (token) { headers.Authorization = 'Bearer ' + token; } $.ajax({ type: 'POST', url: '/api/Account/Logout', headers: headers }).done(function (data) { self.result("Logout Done!"); }).fail(showError); 

Conectó este código a un botón de Cerrar sesión y ¡listo! La página protegida de MVC ahora presenta el error 401 no autorizado esperado después de hacer clic en el botón Cerrar sesión. Como de costumbre, el recurso WebAPI también presenta un error esperado 401.

Después de todo funciona, creo que el proceso de usar Fiddler para las pruebas causa el problema. Sin embargo, no puedo explicar por qué este es el caso.

Gracias por leer.