2016-01-12 20 views
17

Sto utilizzando il middleware OWIN in un Authentication Server esterno che le mie applicazioni autenticano utilizzando il flusso di autorizzazione del codice di autorizzazione OAuth.OWIN SignOut non rimuove i cookie

Posso reindirizzare al server di autenticazione, autenticarsi con un provider esterno (Google) e reindirizzare nuovamente all'applicazione client con un utente registrato e il set di cookie dell'applicazione, ma quando provo ad uscire il cookie rimane dopo Chiamo il metodo AuthenticationManager.SignOut

Opzioni per il mio cookie nel Startup.Auth.cs sono:

var cookieOptions = new CookieAuthenticationOptions 
        { 
         Provider = cookieProvider, 
         AuthenticationType = "Application", 
         AuthenticationMode = AuthenticationMode.Passive, 
         LoginPath = new PathString("/Account/Index"), 
         LogoutPath = new PathString("/Account/Logout"), 
         SlidingExpiration = true, 
         ExpireTimeSpan = TimeSpan.FromMinutes(30), 
        }; 
app.UseCookieAuthentication(cookieOptions); 
app.SetDefaultSignInAsAuthenticationType(DefaultAuthenticationTypes.ExternalCookie); 
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

mio metodo login:

var loginInfo = await AuthManager.GetExternalLoginInfoAsync(); 
SignInManager.ExternalSignInAsync(loginInfo, true); 
var identity = AuthManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie).Result.Identity; 

if (identity != null) 
{ 
    AuthManager.SignIn(
        new AuthenticationProperties {IsPersistent = true}, 
        new ClaimsIdentity(identity.Claims, "Application", identity.NameClaimType, identity.RoleClaimType)); 

     var ticket = AuthManager.AuthenticateAsync("Application").Result; 
     var identity = ticket != null ? ticket.Identity : null; 
     if (identity == null) 
     { 
      AuthManager.Challenge("Application"); 
      return new HttpUnauthorizedResult(); 
     } 

     identity = new ClaimsIdentity(identity.Claims, "Bearer", identity.NameClaimType, identity.RoleClaimType); 
     AuthManager.SignIn(identity); 
} 

return Redirect(Request.QueryString["ReturnUrl"]); 

Segno fuori Metodo:

var authTypeNames = new List<string>(); 
authTypeNames.Add("Google"); 
authTypeNames.Add("Application"); 
authTypeNames.Add("Bearer"); 
authTypeNames.Add(DefaultAuthenticationTypes.ExternalCookie); 

Request.GetOwinContext().Authentication.SignOut(authTypeNames.ToArray()); 

ho guardato altre domande come: OWIN authentication, expire current token and remove cookie e OWIN - Authentication.SignOut() doesn't remove cookies

senza fortuna. Sono consapevole che potrei cancellare manualmente il cookie impostando una data di scadenza negativa, ma preferirei usarla nel metodo built se possibile.

Come si rimuove il Cookie dell'applicazione quando si chiude?

+0

bene .. non è la prima volta che questo si precisa http://stackoverflow.com/questions/22571696/mvc5-identity-owin-signout-events – ymz

+0

@ymz, che è una questione diversa. Sto chiedendo di uscire usando un Authentication Server esterno chiamato da un'altra applicazione. – Steve

risposta

-3

Se si dispone di una pagina master, aggiungere il tag seguente. Potrebbe essere questo sarebbe utile.

<meta http-equiv="Cache-control" content="no-cache" /> 
+0

Non vedo come questo potrebbe funzionare dal momento che voglio memorizzare nella cache, e questo non funziona in Firefox o Chrome o anche IE su HTTPS - http://securityevaluators.com/knowledge/case_studies/caching/ – Steve

1

Da un altra risposta StackOverflow che ha funzionato per me: OWIN - Authentication.SignOut() doesn't seem to remove the cookie

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

https://dzone.com/articles/catching-systemwebowin-cookie

Vorrei assumere la seconda avrebbe funzionato per te, ma sembra che sia quello che stai facendo. Puoi testarlo da solo? Commenta il tuo array e conferma che funziona o no.

Per essere onesto, non so abbastanza su OWIN per conoscere la modalità di autenticazione passiva, tuttavia.

1

Affinché il metodo SignOut contrassegni il ticket di autenticazione (cookie) per la rimozione dal client, il parametro AuthenticationType che si passa al metodo SignOut e il valore sul cookie devono corrispondere esattamente. Se si desidera rimuovere più di un ticket di autenticazione dal client, sarà necessario associare TUTTI questi AuthenticationTypes e passarli come stringa [] al metodo SignOut.

L'AuthenticationType di un ticket di autenticazione di solito preceduto dal nome del contenitore web host (ad esempio ".AspNet") seguito da qualsiasi impostazione di boot con le impostazioni OWIN CookieAuthentication.

Sembra che tu abbia impostato il valore di stringa AuthenticationType su "Applicazione" in Startup.Auth.cs.Prova semplicemente chiamando:

Request.GetOwinContext().Authentication.SignOut("Application"); 

Se questo non funziona per voi, vorrei eseguire il debug dell'applicazione e dare un'occhiata al AuthenticationType specifiche sull'identità per ogni tipo di utente autenticato vostra applicazione permette, annotare il valore del AuthenticationType per ognuno e provare a includerli tutti in una stringa [] nella chiamata di SignOut.

1
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 
FormsAuthentication.SignOut(); 
Session.Abandon(); 
+0

Questo potrebbe essere un miglioramento rispetto alle altre risposte già esistenti, ma non l'hai spiegato. Sebbene questo blocco di codice possa rispondere alla domanda, sarebbe meglio se tu potessi fornire una piccola spiegazione sul perché lo fa. –

Problemi correlati