OWIN – Authentication.SignOut () non sembra rimuovere il cookie

Sto riscontrando alcuni problemi con l’autenticazione dei cookie OWIN. Ho un sito .Net che ha alcune pagine MVC che usa l’autenticazione dei cookie e le risorse WebAPI protette da un token al portatore.

Quando esco, cancello il token di accesso sul client, quindi le richieste API successive non avranno il token nell’intestazione e quindi falliranno l’autenticazione. Questa parte va bene.

Allo stesso modo, mi piacerebbe anche la disconnessione per eliminare il cookie utilizzato dalle pagine MVC. Ho fatto quanto segue sul server:

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

Tuttavia, dopo il Logout di chiamata, posso comunque visitare la pagina MVC protetta anche se il cookie sarebbe stato cancellato dalla chiamata di Logout.

Sembra così semplice, quindi potrei aver perso qualcosa.

Grazie,

Ho avuto un problema simile negli ultimi giorni. Invece di

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

Usa ONE (e solo uno) di questi:

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

Questo articolo spiega perché i tuoi cookie non vengono cancellati: http://dotnet.dzone.com/articles/catching-systemwebowin-cookie

So che la mia risposta non è la più basata sulla ricerca, ma per dirti la verità, non riuscivo a trovare perché i miei esempi di codice forniti funzionassero per me. So solo che System.Web mette a posto i cookie Owins se fai SignOut () in un altro modo.

Questo ha funzionato per me. Gettalo in un controller quando vuoi invalidare il cookie. In particolare, l’ho usato per aggiornare i ruoli dell’utente in modo che l’utente non debba disconnettersi e rientrare manualmente per correggere i menu che vengono caricati in @if(User.IsInRole("Admin")){...} . Spero che questo aiuti qualcuno – mi ci è voluto un po ‘per capirlo.

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

Ho seguito tutte le soluzioni di cui sopra ma alla fine mi sono confuso perché l’utente non si è disconnesso. Finalmente il mio problema è stato risolto da:

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

Perché ho usato SessionAuthenticationModule per mantenere le attestazioni in esso, quindi dopo la disconnessione, l’utente potrebbe utilizzare app a causa della FedAut esistente nei cookie.

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

Informazioni su ASP .Net MVC Logout non funzionante: –

Ho avuto un problema in cui l’app ospitata su IIS nelle modalità di produzione non funzionava correttamente con Chrome

anche se ha funzionato correttamente – utilizzando Visual Studio Dev in hosting su tutti i browser – in modalità di produzione su IE

Ho avuto problemi in Startup.Auth.CS. Assicurati che le configurazioni duplicate non siano lì per le seguenti cose

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

Ho fatto in modo che funzionasse. Ecco cosa ho fatto:

Quando ho chiamato l’azione di disconnessione sopra, ho usato Fiddler perché stavo ancora testando la funzione di disconnessione. Inserisco un breakpoint e sì il metodo è invocato con successo. Chiama authenticationManager.SignOut () tuttavia la mia pagina protetta funziona ancora.

Quindi, invece di usare Fiddler, ho deciso di inserire il codice nel client:

  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); 

Ha cablato questo codice fino a un pulsante di disconnessione e voilà! La pagina MVC protetta ora genera l’errore 401 non autorizzato dopo aver fatto clic sul pulsante Logout. Come al solito, la risorsa WebAPI presenta anche un errore 401 previsto.

Dopotutto funziona, penso che il processo di utilizzo di Fiddler per testare in qualche modo causi il problema. Tuttavia non posso spiegare perché questo è il caso.

Grazie per aver letto.