web-dev-qa-db-fra.com

Comment définir les cookies d'identité asp.net expire

J'utilise Asp.Net Identity pour contrôler l'autorisation de mon application. Maintenant, je dois faire ceci: si l'utilisateur ne fonctionne pas dans 30 minutes, accédez à la page de connexion, lorsqu'il ne se connecte pas, cochez la case "isPersistent". Et, s'il a coché la case "isPersistent", définissez la date d'expiration du cookie sur 14 jours. J'essaie de le faire en modifiant le Startup.Auth.cs comme ceci:

public void ConfigureAuth(IAppBuilder app)
{
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        SlidingExpiration = true,
        CookieName = WebHelpers.ConstStrings.AUTHCOOKIESNAME
    });
}

et le code SignIn comme ceci:

private async Task SignInAsync(User user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
    if (isPersistent)
    {
        AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
    }
    else
    {
        AuthenticationManager.SignIn(new AuthenticationProperties() { ExpiresUtc = new DateTimeOffset(DateTime.UtcNow.AddMinutes(30)) }, identity);
    }
}

Mais j'ai constaté que lorsque l'utilisateur ne choisit pas la case à cocher isPersistent, la date d'expiration des cookies est déjà "Session", pas l'heure actuelle plus 30 minutes.

enter image description here

Le statut des cookies lorsque vous utilisez le code comme après, donc la case à cocher "Se souvenir de moi" ne peut pas fonctionner. :(.

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            ExpireTimeSpan = TimeSpan.FromMinutes(30),
            SlidingExpiration = true,
            CookieName = WebHelpers.ConstStrings.AUTHCOOKIESNAME
        });

enter image description here

24
Ivan.Yu

Si la propriété IsPersistent de AuthenticationProperties est définie sur false, le délai d'expiration du cookie est défini sur Session.

Si case à cocher "se souvenir de moi" est coché alors AuthenticationManager.SignIn(new AuthenticationProperties{ IsPersistent = true }, userIdentity); créera un cookie dont le délai d'expiration est égal à ExpireTimeSpan que vous avez configuré dans Startup.cs (Par défaut à 14 jours).

Si case à cocher "se souvenir de moi" est NON coché alors vous devez utiliser AuthenticationManager.SignIn(new AuthenticationProperties{ IsPersistent = true, ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30)}, userIdentity);. Encore une fois, IsPersistent est défini sur true, mais maintenant nous donnons une valeur à ExpiresUtc afin qu'il n'utilise pas de CookieAuthenticationOptions de Startup.cs.

public override async Task SignInAsync(ApplicationUser user, bool isPersistent, bool rememberBrowser)
{
    var userIdentity = await CreateUserIdentityAsync(user).WithCurrentCulture();
    // Clear any partial cookies from external or two factor partial sign ins
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.TwoFactorCookie);
    if (rememberBrowser)
    {
        var rememberBrowserIdentity = AuthenticationManager.CreateTwoFactorRememberBrowserIdentity(ConvertIdToString(user.Id));
        AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, userIdentity, rememberBrowserIdentity);
    }
    else
    {
        //AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, userIdentity);
        if (isPersistent)
        {
            AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = true }, userIdentity);
        }
        else
        {
            AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = true, ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30) }, userIdentity);
        }        
    }
}
38
tmg

Utilisez ceci...

public void ConfigureAuth(IAppBuilder app)
{
  app.UseCookieAuthentication(new CookieAuthenticationOptions
  {
      ExpireTimeSpan = TimeSpan.FromHours(1),
  });            
}
8
Nabeel Zafar

J'ai eu le même problème et ce code a fonctionné pour moi (dans le fichier Startup.cs) ..

services.Configure<IdentityOptions>(options =>
{
    options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(9999);
});

Cela ajoute environ 27 ans (ou n'expire jamais) au cookie persistant.

NB: Si vous vouliez moins d'un délai d'expiration, vous pouvez utiliser TimeSpan.FromMinutes(1); pendant 1 minute ou TimeSpan.FromSeconds(30); pendant 30 secondes etc.

1
Garth