2015-08-25 41 views
14

In diversi luoghi in un 2.0 implementazione standard ASP.Net MVC Identità Owin vedrete rememberBrowser, come:Che cosa fa esattamente OwinBrowser?

await signInManager.SignInAsync(user, isPersistent: isPersistent, rememberBrowser: false); 

Se si imposta rememberBrowser al vero, ho notato che posso uccidere il browser, kill IIS Express, eliminare l'utente nel quale il browser è stato connesso, anche riavviare il mio computer e il browser è ancora considerato come connesso. Non così grandioso, considerando che un utente eliminato che viene trattato come autorizzato/loggato causerà tutti i tipi di problemi nel codice dietro l'attributo [Authorize] che si aspetta abbia un utente valido con cui lavorare.

Quindi, cosa sta esattamente ricordandoBrowser, e c'è qualche rischio che qualcuno possa semplicemente fingere di ricordare Browser nei propri cookie per aggirare l'accesso OWIN? Sembra che il punto di [Authorize] sia quello di garantire che nessuno, ma gli utenti loggati, accedano a una determinata azione del controllore, e rememberBrowser sembra essere un buco in tale garanzia.

Domanda bonus: C'è un modo per disabilitare rememberBrowser in modo che anche se un cookie contraffatto è arrivato, sarebbe stato rifiutato?

risposta

4

Penso che rememberBrowser è rilevante solo nell'autenticazione a due fattori. Quindi, se si imposta su true, il browser acquisirà il cookie TwoFactorRememberBrowser che consente all'utente di ignorare l'autenticazione 2FA (se attivata) durante la procedura di accesso.

C'è un modo per disattivare rememberBrowser modo che anche se un forgiato biscotto è venuto in, sarebbe stato rifiutato?

Il cookie creato da rememberBrowser viene utilizzato insieme al cookie di autenticazione. Permetterà all'utente solo di saltare 2FA, quindi è inutile senza essere autenticato prima.

5

La risposta di @Hezye è corretta, ma ci soffermerò su un po 'di più.

Ecco il codice che crea un'identità per "rememberBrowser" CreateTwoFactorRememberBrowserIdentity (https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Owin/Extensions/AuthenticationManagerExtensions.cs linea 215):

public static ClaimsIdentity CreateTwoFactorRememberBrowserIdentity(this IAuthenticationManager manager, 
    string userId) 
{ 
    if (manager == null) 
    { 
     throw new ArgumentNullException("manager"); 
    } 
    var rememberBrowserIdentity = new ClaimsIdentity(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); 
    rememberBrowserIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userId)); 
    return rememberBrowserIdentity; 
} 

Quindi questa identità è con il tipo di "TwoFactorRememberBrowserCookie" e con solo pretesa di ID utente.

Guardando sul codice sorgente di SignInManager che utilizza questo codice: (https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Owin/SignInManager.cs linea 106):

if (rememberBrowser) 
{ 
    var rememberBrowserIdentity = AuthenticationManager.CreateTwoFactorRememberBrowserIdentity(ConvertIdToString(user.Id)); 
    AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, userIdentity, rememberBrowserIdentity); 
} 

Qui IAuthenticationManager viene utilizzata per firmare-in 2 identità: una per l'utente effettivo, un altro per "rememberBrowser ". E credo che questo produrrà 2 cookie: un cookie di autenticazione utente, un altro che ricorda il browser.

In SignInManager quando si utilizza SignInOrTwoFactor il codice (riga 218) verifica se l'identità "RememberBrowser" è già impostata nei cookie.

I cookie OWIN sono protetti da crittografia, la crittografia è presa in prestito da DpapiDataProtector (documentation). Non sono esperto in crittografia, quindi non posso commentare la forza della crittografia. Sto solo dicendo che il cookie "rememberBrowser" è crittografato allo stesso modo del cookie di autenticazione principale.

Per quanto riguarda l'esercizio in cui è stato riavviato IIS, computer, ecc. I cookie sono stati rimossi dal browser? Perché se non lo hai, Identity (o meglio OWIN) tratterà il browser come loggato, anche se il record dell'utente originale viene rimosso dal database. Anche se l'utente non sarà loggato a lungo poiché nel codice MVC del modello predefinito è presente del codice che controlla il database con il record utente e si disconnette se il record utente è stato modificato.

Come per disabilitare "rememberBrowser", passare sempre false a tale argomento. E il secondo cookie non verrà impostato.

Problemi correlati