web-dev-qa-db-fra.com

ASP.NET Core MVC: définition de l'expiration du cookie d'identité

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?

28
severin

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);

RememberMe correspond à ce que nous configurons si nous définissons IsPersistent sur true ou false.

42
user1620696

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.

10
cheesemacfly

Pour ASP.NET Core 2.0

  services.ConfigureApplicationCookie(options =>
        {
            options.Cookie.Name = "CookieName";
            options.Cookie.Expiration = TimeSpan.FromDays(2);
        });
9
Ahmed Al Jabry

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.

7
BorisSh

Essayer

app.UseIdentity().UseCookieAuthentication(
    new CookieAuthenticationOptions
    {
        ExpireTimeSpan = TimeSpan.FromHours(1)
    }
);
2
Damien Dennehy

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

1
Ole K