Dans mon application ASP.NET Core MVC, la durée de vie du cookie d'authentification est définie sur "Session". Elle dure donc jusqu'à la fermeture du navigateur. J'utilise le schéma d'authentification par défaut pour MVC:
app.UseIdentity();
Comment puis-je prolonger la durée de vie du cookie?
Le middleware ASP.NET Identity que vous utilisez est un wrapper autour d'appels à UseCookieAuthentication
, qui inclut le middleware d'authentification de cookie sur le pipeline. Ceci peut être vu sur le code source pour les extensions de constructeur du middleware Identity ici sur GitHub . Dans ce cas, les options nécessaires pour configurer le fonctionnement de l'authentification par cookie sous-jacente sont encapsulées sur le IdentityOptions
et configurées lors de la configuration de l'injection de dépendance.
En effet, en regardant le code source que je vous ai lié, vous pouvez voir que ce qui suit s’exécute lorsque vous appelez 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;
Pour configurer la classe IdentityOptions
, le AddIdentity<TUser, TRole>
La méthode a une version surchargée qui permet de configurer les options avec un lambda. Ainsi, il vous suffit de passer un lambda pour configurer les options. Dans ce cas, il vous suffit d'accéder aux propriétés Cookies
de la classe d'options et de configurer le ApplicationCookie
comme vous le souhaitez. Pour changer la durée, vous faites quelque chose comme
services.AddIdentity<ApplicationUser, IdentityRole>(options => {
options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromHours(1);
});
EDIT: La propriété ExpireTimeSpan
n'est utilisée que si vous appelez HttpContext.Authentication.SignInAsync
_ nous passons dans une instance de AuthenticationProperties
avec IsPersistent
défini sur true
.
Essayer avec le middleware d’authentification des cookies s’avère que cela fonctionne: si nous nous connectons sans cette option, nous obtenons un cookie qui dure pour la session, si nous l’envoyons ensemble, nous obtenons un cookie qui dure comme nous l’avons configuré lors de la configuration. le middleware.
Avec ASP.NET Identity, vous devez passer le paramètre isPersistent
du PasswordSignInAsync
avec la valeur true
. Ceci finit par être un appel à SignInAsync
du HttpContext
en passant le AuthenticationProperties
avec le IsPersistent
défini sur true. L'appel finit par être quelque chose comme:
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
Où RememberMe
correspond à ce que nous configurons si nous définissons IsPersistent
sur true ou false.
Il y a une réponse pour la version 2.0 mais cela n'a pas fonctionné pour moi. Je devais faire:
services.ConfigureApplicationCookie(options =>
{
options.ExpireTimeSpan = TimeSpan.FromDays(30);
});
La valeur par défaut est 14 jours.
Pour ASP.NET Core 2.0
services.ConfigureApplicationCookie(options =>
{
options.Cookie.Name = "CookieName";
options.Cookie.Expiration = TimeSpan.FromDays(2);
});
Dans ASP.NET Core 2.0, utilisez la propriété ExpireTimeSpan au lieu de Cookie.Expiration.
services.ConfigureApplicationCookie(options =>
{
options.Cookie.Name = "CookieName";
options.ExpireTimeSpan = TimeSpan.FromHours(24);
options.SlidingExpiration = true;
});
De docs :
Cookie.Expiration: Obtient ou définit la durée de vie d'un cookie. Actuellement, cette option n'est pas opérationnelle et deviendra obsolète dans ASP.NET Core 2.1+. Utilisez l'option ExpireTimeSpan pour définir l'expiration du cookie.
Essayer
app.UseIdentity().UseCookieAuthentication(
new CookieAuthenticationOptions
{
ExpireTimeSpan = TimeSpan.FromHours(1)
}
);
Pour une raison quelconque, le problème survient lors de l'utilisation de SignInAsync([..], true)
, le cookie n'a jamais été affiché dans le navigateur (et correctement, la connexion a échoué):
J'ai donc essayé d'ajouter la différence de fuseau horaire UTC dans TimeSpan de 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) );
});
Voila! Cela a fonctionné et le cookie est affiché avec l'expiration + 5min uniquement dans le navigateur.
PingBack à github.com https://github.com/aspnet/Identity/issues/766#issuecomment-253237576