ASP.NET MVC de base: paramétrage de l'expiration du cookie d'identité

dans mon ASP.NET application MVC de base la durée de vie du cookie d'authentification est définie à 'Session', de sorte qu'il dure jusqu'à ce que je ferme le 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?

20
demandé sur user1620696 2016-01-24 21:27:55

6 réponses

le ASP.NET L'middleware D'identité que vous utilisez est un wraper autour de certains appels à UseCookieAuthentication qui inclut l'middleware D'authentification Cookie sur le pipeline. Cela peut être vu sur le code source pour les extensions builder de l'middleware D'identité ici sur GitHub. Dans ce cas, les options nécessaires pour configurer le fonctionnement de L'authentification du Cookie sous-jacent sont encapsulées sur le IdentityOptions et configuré lors de la configuration de la dépendance injection.

en effet, en regardant le code source auquel j'ai fait référence, vous pouvez voir que ce qui suit est exécuté 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;

installation IdentityOptions classe AddIdentity<TUser, TRole> méthode a une version surchargée qui permet de configurer les options avec un lambda. Il suffit donc de passer dans une lambda pour configurer les options. Dans ce cas, vous accédez simplement à la Cookies propriétés de la classe d'options et configurer le ApplicationCookie comme souhaité. Pour changer l'heure durée de vous faire quelque chose comme

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

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

});

EDIT:ExpireTimeSpan la propriété n'est utilisée que si HttpContext.Authentication.SignInAsync nous passons dans une instance de AuthenticationPropertiesIsPersistenttrue.

essayer juste avec L'Middleware D'authentification de Cookie il s'avère que cela fonctionne: si nous nous connectons simplement sans cette option, nous obtenons un cookie qui dure pour la session, si nous l'envoyons ensemble nous obtenons un cookie qui dure ce que nous configurons lors de la configuration du intergiciel.

avec ASP.NET Identity la façon de faire est de passer le paramètre isPersistentPasswordSignInAsync valeur true. Cela finit par être un appel à SignInAsyncHttpContext passage dans le AuthenticationPropertiesIsPersistent mis à true. L'appel finit par être quelque chose comme:

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

RememberMe est ce que configure si nous sommes paramètre IsPersistent à vrai ou faux.

33
répondu user1620696 2016-03-11 19:14:35

Il y a une réponse pour la version 2.0 mais ça n'a pas marché pour moi. J'ai eu à faire:

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

La valeur par défaut est de 14 jours.

5
répondu cheesemacfly 2017-11-06 21:33:04

app.UseIdentity().UseCookieAuthentication(
    new CookieAuthenticationOptions
    {
        ExpireTimeSpan = TimeSpan.FromHours(1)
    }
);
2
répondu Damien Dennehy 2016-01-24 19:39:52

Pour une raison quelconque, j'ai eu le problème lors de l'utilisation de SignInAsync([..], true) le cookie n'a jamais été être affiché dans le navigateur (et correctement la connexion a échoué):

alors, j'ai essayé d'ajouter la différence de fuseau horaire UTC dans la durée 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! Il a fonctionné et le cookie est affiché avec +5min expiration seulement dans le navigateur.

PingBack à github.com https://github.com/aspnet/Identity/issues/766#issuecomment-253237576

1
répondu Ole K 2016-10-12 15:16:12

pour ASP.NET Core 2.0

  services.ConfigureApplicationCookie(options =>
        {
            options.Cookie.Name = "CookieName";
            options.Cookie.Expiration = TimeSpan.FromDays(2);
        });
1
répondu Ahmed Al Jabry 2017-11-05 10:25:37

dans ASP.NET Core 2.0 utiliser la propriété ExpireTimeSpan au lieu de Cookie.Expiration.

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

docs:

Cookie.Expiration: Obtient ou définit la durée de vie d'un cookie. Actuellement, cette option no-ops et deviendra obsolète en ASP.NET noyau 2.1+. Utilisez L'option ExpireTimeSpan pour définir l'expiration du cookie.

1
répondu BorisSh 2017-12-27 07:01:38