7

Ho un'applicazione ASP.NET MVC 5 che utilizza ASP.NET Identity 2.1.0 per l'autenticazione dell'utente.
Tutto ha funzionato bene in passato, ma ora ho scoperto che le sessioni utente persistenti non funzionano più. Non posso dire quale cambiamento ha rotto questo, ma ha funzionato quando ho implementato Identity (convertito l'applicazione dal SimpleMembership) e questa è la mia logica ho in questo momento:IsPersistent non funziona - Cookie valido solo per la sessione corrente

var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, 
            model.RememberMe, shouldLockout: true); 

SignInManager è la mia ApplicationSignInManager sulla base di SignInManager<ApplicationUser, int> e model.RememberMe è true.

E la mia messa a punto:

app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 

app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login"), 
     Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = ApplicationCookieIdentityValidator.OnValidateIdentity(
        validateInterval: TimeSpan.FromMinutes(0), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
    }); 
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); 
app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); 
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

Tutto funziona bene, tranne persistente le sessioni utente. Ho controllato i cookie restituiti dal mio server e lo .AspNet.ApplicationCookie è sempre restituito come "valido per la sessione corrente" invece di una data futura. Quindi, quando chiudo e riapro il browser devo accedere nuovamente ...

Qualcuno ha un'idea del motivo per cui questo non funziona (più)?

PS: Ho sovrascritto SignInAsync nel mio ApplicationSignInManager perché faccio un po 'di logica personalizzata lì, ma ho anche controllato con il debugger e per il seguente invito:

await base.SignInAsync(user, isPersistent, rememberBrowser); 

isPersistent è true, quindi dovrebbe creare un cookie persistente.

+0

Sospetto che 'validateInterval: TimeSpan.FromMinutes (0)' possa causare questo. Perché su ogni richiesta rigenera cookie e ne imposta uno nuovo. Prova a impostare 'validateInterval' su qualcosa di più di 0 e vedi se funziona. – trailmax

+0

@trailmax: Grazie, era così.Le modifiche sono state apportate con V 2.1? Perché ha sicuramente funzionato all'inizio (con V 2.0). In ogni caso: posta questo come risposta e io lo accetterò. Ora ho bisogno di trovare una soluzione, poiché ho bisogno (a causa di SSO) di convalida su ogni richiesta. – ChrFin

risposta

6

This is a known bug in Identity e guardando su this answer non è molto nuovo.

Quando il cookie viene rigenerato su ogni richiesta, il flag "IsPersisted" non viene impostato, quando, anche quando è stato impostato nel cookie originale.

Per ovviare a questo, è necessario implementare la propria versione di cookie validator che imposterà il flag come dovrebbe.

Penso di avere la soluzione per te, ma non l'ho compilato o testato, solo una direzione generale di dove devi andare. Vedi questo gist for full code.
Questo è solo un codice SecurityStampValidator preso dal decompilatore. Ho added lines 91-96. Sostanzialmente prendo il flag "IsPersistent" dal cookie precedente e lo aggiungo al nuovo cookie, quando viene creato. Questo non è stato fatto nella versione non modificata.

E poi nel vostro Auth.Config che fai:

Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = MySecurityStampValidator.OnValidateIdentity(
        validateInterval: TimeSpan.FromMinutes(0), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 

Attenzione però, quando la nuova versione è fuori, controllare se questo è stato fissato, in modo da poter rimuovere il fix sporco. Questo problema è reported to be fixed, ma poco dopo la versione 2.1 era fuori.

+1

Grazie mille. Dato che ho già il mio validatore (vedi 'ApplicationCookieIdentityValidator' nel mio codice) ho anche solo bisogno di aggiungere le tue modifiche anche lì -> working! – ChrFin

+0

@ChrFin Sì, ho notato che il nome è diverso dallo standard. Lieto che aiuti! – trailmax

+0

bel codice! Sembra che manchi 'usando Microsoft.Owin.Security;' per accedere al tipo 'AuthenticationProperties' anche se – Matthew

1

L'aggiornamento di entrambi AspNet.Identity.Core e AspNet.Identity.Owin a 2.2.1 dovrebbe risolvere questo problema.

+1

dopo l'aggiornamento ha ancora lo stesso problema e anche il modello predefinito per asp.mvc per Identity core ha lo stesso problema. –

+0

sì, lo stesso problema con l'identità core ... –

+0

https://stackoverflow.com/questions/31946582/how-ispersistent-works-in-owin-cookie-authentication/46659752#46659752 –

Problemi correlati