2016-07-18 165 views
15

Sto seguendo this tutorial ma non ti dirò come effettuare il logout. Ho cercato di fareCome disconnettersi dai provider Owin?

Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie); 

Request.GetOwinContext().Authentication.SignOut() 

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

È possibile ottenere il codice di esempio qui: https://github.com/AndersAbel/SocialLoginWithoutIdentity

Solo bisogno di aggiungere un altro azione

public ActionResult SignOut() 
{ 
     Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie); 
     return RedirectToAction("Index", "Home"); 
} 

Questo metodo più uno qualsiasi dei 3 linee di I postato sopra

Il mio risultato adesso è, accedo, vado alla pagina sicura e posso vederlo, poi procedo al mio signout e poi dopo il segnale cerco di tornare alla pagina sicura e posso tornare a quella pagina sicura.

Quindi in realtà non mi ha davvero firmato.

+0

Non disconnette? – Win

+0

No. Posso accedere alle mie pagine protette senza effettuare il login. Sembra di ricreare il cookie con tutte le affermazioni in esso contenute. È come se fosse il login automatico per sempre. – chobo2

+0

http://stackoverflow.com/a/24611815/2850543 –

risposta

11

Come menzionato nel tutorial, il middleWare usato usa il tipo di autenticazione predefinito ma non lo sovrascrive.

Utilizzando solo externalCookie come parametro per la Owin si sta cancellando il cookie per Asp, ma non quella utilizzata per memorizzare il fornitore Google,

a farlo, si dovrà ottenere la matrice di tutti cookie correnti. Si può fare nel modo più semplice in questo modo:

Request.GetOwinContext() 
     .Authentication 
     .SignOut(HttpContext.GetOwinContext() 
          .Authentication.GetAuthenticationTypes() 
          .Select(o => o.AuthenticationType).ToArray()); 

Questo è dove si dice sul Tutorial:

La chiamata a UseGoogleAuthentication dovrebbe essere abbastanza ovvio il motivo per cui è necessario.

Ma il primo toSetDefaultSignInAsAuthenticationType non è come ovvio. Il middleware di login si basa normalmente sul middleware dei cookie esterni registrato prima del middleware di accesso social. middleware cookie esterno, si imposta come tipo di accesso predefinito. Ecco come il middleware di login sociale sa che dovrebbe usare il cookie esterno . In questa configurazione non è presente alcun cookie esterno, pertanto abbiamo per impostare manualmente il middleware dei cookie principale come tipo di accesso predefinito. Il middleware cookie emetterà un cookie solo se il AuthenticationType corrisponde a quello nell'identità creata dal middleware di accesso social .Osservando la pipeline di autenticazione esterna di owin un social nella configurazione di

+0

Questo sembra funzionare. Sono un po 'confuso cosa fa allora la pulizia solo del cookie per ASP? Cosa intendi al 100% con "tipo di autenticazione predefinito ma non eseguirne l'override". Pensavo che External Cookie in realtà si riferisse a cookie fatti da qualcosa come Google. Non al biscotto Asp. – chobo2

+0

Mi spiace, l'inglese non è la mia lingua madre quindi potrebbe non significare ciò che voglio significare, ma è spiegato nel collegamento su questo paragrafo: – GaelSa

+0

problema di Internet, beh, ho aggiornato la mia risposta per mostrare dove ho trovato la soluzione nel tutorial. – GaelSa

1

Utilizzare l'attributo [Autorizza] sulle classi che hanno bisogno di autorizzazione:

[Authorize] 
public class MeController : ApiController 
{ 
    // GET api/<controller> 
    public IEnumerable<object> Get() 
    { 
     var identity = User.Identity as ClaimsIdentity; 
     return identity.Claims.Select(c => new 
     { 
      Type = c.Type, 
      Value = c.Value 
     }); 
    } 
} 

fonte: http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server

+0

Ho autorizzato i tag sulle mie cose in questo momento che non è il problema. Il problema è che ho seguito il tutorial e aggiunto un metodo signout (che contiene 2 righe di codice, uno dei 3 nel mio OP e reindirizza alla home page). Quando faccio clic su signout e poi torno su una pagina sicura, posso ancora accedere a quella pagina protetta anche se dovrei essere effettivamente disconnesso. In realtà non mi disconnette mai. – chobo2

+1

Perché il voto negativo? All'inizio di questa domanda non era noto se il problema fosse la disconnessione o le pagine non protette ... –

3

provare a impostare le intestazioni di controllo della cache.

public ActionResult SignOut() { 
    var authenticationTypes = new string[] { 
     DefaultAuthenticationTypes.ApplicationCookie, 
     DefaultAuthenticationTypes.ExternalCookie 
    }; 
    AuthenticationManager.SignOut(authenticationTypes); 
    // HACK: Prevent user from being able to go back to a logged in page once logged out 
    Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetNoStore(); 
    // now redirect 
    return RedirectToAction("Index", "Home");  
} 

private IAuthenticationManager AuthenticationManager { 
    get { 
     return Request.GetOwinContext().Authentication; 
    } 
} 

c'è sosta l'utente fa clic sul pulsante Indietro del browser, a meno che non si tenta di JavaScript, che può essere disabilitato. L'utente può tornare indietro e visualizzare ciò che era nella pagina precedente, ma se provano a fare clic su qualsiasi link protetto o aggiornare la pagina, verranno reindirizzati per accedere.