18

Nella mia app ASP.NET Core MVC la durata del cookie di autenticazione è impostata su 'Sessione', quindi dura fino a quando non chiudo il browser. Io uso lo schema di autenticazione predefinito per MVC:ASP.NET Core MVC: impostazione scadenza cookie identità

app.UseIdentity(); 

Come posso prolungare la durata del cookie?

risposta

29

Il middleware ASP.NET identità che si sta utilizzando è un wraper intorno alcune chiamate a UseCookieAuthentication che comprende il middleware cookie di autenticazione sul gasdotto. Questo può essere visto sul codice sorgente per le estensioni builder del middleware Identity here on GitHub. In tal caso, le opzioni necessarie per configurare il funzionamento dell'autenticazione cookie sottostante sono incapsulate su IdentityOptions e configurate durante l'impostazione dell'input di dipendenza.

In effetti, guardando il codice sorgente ho collegato a si può vedere che il seguente viene eseguito quando si chiama app.UseIdentity():

var options = app.ApplicationServices.GetRequiredService<IOptions<IdentityOptions>>().Value; 
app.UseCookieAuthentication(options.Cookies.ExternalCookie); 
app.UseCookieAuthentication(options.Cookies.TwoFactorRememberMeCookie); 
app.UseCookieAuthentication(options.Cookies.TwoFactorUserIdCookie); 
app.UseCookieAuthentication(options.Cookies.ApplicationCookie); 
return app; 

Per impostare la classe IdentityOptions, il metodo AddIdentity<TUser, TRole> ha una versione di overload che permette di configurare le opzioni con una lambda. Quindi devi solo passare un lambda per configurare le opzioni. In tal caso, è sufficiente accedere alle proprietà Cookies della classe di opzioni e configurare ApplicationCookie come desiderato. Per modificare l'intervallo di tempo si fa qualcosa di simile

services.AddIdentity<ApplicationUser, IdentityRole>(options => { 

    options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromHours(1); 

}); 

EDIT: La proprietà ExpireTimeSpan viene utilizzata solo se al momento della chiamata HttpContext.Authentication.SignInAsync passiamo in un'istanza di AuthenticationProperties con IsPersistent set per true.

Provando solo con il middleware di autenticazione dei cookie si scopre che funziona: se effettuiamo l'accesso senza questa opzione, otteniamo un cookie che dura per la sessione, se inviamo questo insieme otteniamo un cookie che dura quanto abbiamo configurato durante la configurazione del middleware.

Con ASP.NET Identity il modo per fare è passare il parametro isPersistent del PasswordSignInAsync con il valore true. Si tratta di una chiamata allo SignInAsync dello HttpContext passando allo AuthenticationProperties con lo IsPersistent impostato su true. La chiamata finisce per essere qualcosa di simile:

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); 

Qualora il RememberMe è quello che consente di configurare se stiamo impostando IsPersistent true o false.

+0

Grazie, usando questo sono in grado di cambiare il nome del cookie usando questo approccio, ma anche se imposto ExpireTimeSpan la durata del cookie auth è impostata su 'Session'. Qualche idea sul perché? Questo è il mio Startup.cs: https://github.com/severisv/MyTeam/blob/master/src/MyTeam/Startup.cs Ho provato a disabilitare Facebook-auth. Non sto usando https. – severin

+0

@fiskeboss Ho aggiunto una modifica su ciò che ho scoperto riguardo a questo argomento. – user1620696

+0

Ah, certo, grazie! – severin

2

Prova

app.UseIdentity().UseCookieAuthentication(
    new CookieAuthenticationOptions 
    { 
     ExpireTimeSpan = TimeSpan.FromHours(1) 
    } 
); 
+0

Ho provato questo, con altre opzioni, ma sembra essere ignorato. –

1

Per qualche motivo ho avuto il problema quando si utilizza SignInAsync([..], true) il cookie non è mai stato mostrato in del browser (e correttamente il login non):

Così, ho provato ad aggiungere la differenza di fuso orario UTC nel periodo di ExpireTimeSpan

services.AddIdentity<ApplicationUser, IdentityRole>(o => 
{ 
    // add TimeSpan with 5 minutes plus timezone difference from Utc time 
    o.Cookies.ApplicationCookie.ExpireTimeSpan = DateTime.Now.Subtract(DateTime.UtcNow).Add(TimeSpan.FromMinutes(5)); 

}); 

Voilà! Ha funzionato e il cookie viene mostrato con la scadenza + 5min solo nel browser.

Pingback per github.com https://github.com/aspnet/Identity/issues/766#issuecomment-253237576

1

per ASP.NET core 2,0

services.ConfigureApplicationCookie(options => 
     { 
      options.Cookie.Name = "CookieName"; 
      options.Cookie.Expiration = TimeSpan.FromDays(2); 
     }); 
3

C'è una risposta per la versione 2.0, ma non ha funzionato per me. Ho dovuto fare:

services.ConfigureApplicationCookie(options => 
{ 
    options.ExpireTimeSpan = TimeSpan.FromDays(30); 
}); 

Il valore predefinito è 14 giorni.

1

In ASP.NET Core 2.0 utilizzare la proprietà ExpireTimeSpan anziché Cookie.Expiration.

services.ConfigureApplicationCookie(options => 
{ 
    options.Cookie.Name = "CookieName";   
    options.ExpireTimeSpan = TimeSpan.FromHours(24); 
    options.SlidingExpiration = true;    
}); 

Da docs:

Cookie.Expiration: Ottiene o imposta la durata di un cookie. Attualmente, questa opzione non funziona e diventerà obsoleta in ASP.NET Core 2.1+. Utilizzare l'opzione ExpireTimeSpan per impostare la scadenza del cookie.