web-dev-qa-db-fra.com

déconnexion auto utilisateur asp.net-core2.0 après 20-30 min

Il y a quelques jours, j'ai décidé de mettre à niveau mon application Web d'asp.net core 1.1 à core 2.0. Tout semble bien fonctionner après des modifications mineures, à l'exception de l'authentification qui ne dure pas plus de 20-30 minutes. 

Nous pouvons prendre l'exemple par défaut de Visual Studio, car je rencontre le même problème dans ma propre application Web et dans "Application Web ASP.NET Core" -> .NET Framework 4.6.1 + ASP.NET Core 2.0 + MVC + Utilisateur individuel Comptes .

La configuration est la valeur par défaut et les utilisateurs doivent être connectés depuis 14 jours:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();
...
    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
    app.UseAuthentication();
...
}

Le PROBLÈME est que l'utilisateur reste connecté uniquement pendant 20-30 minutes. Lorsque l'utilisateur se connecte ("Mémoriser mes informations" est sélectionné), vous pouvez parcourir les pages et même rouvrir le navigateur. L'utilisateur reste connecté. Il semble donc que le cookie d'authentification fonctionne. Cependant, après 20-30 minutes, l’utilisateur est automatiquement déconnecté, ou devrais-je dire que le cookie expire (je ne sais pas ce qui se passe). Vous pouvez vous reconnecter et le jeu recommence.

J'ai essayé de définir l'expiration du cookie d'application, mais cela ne résout pas le problème: 

services.ConfigureApplicationCookie(options => {
    options.ExpireTimeSpan = TimeSpan.FromDays(1); // Just shortens cookie expiration time, but still logs out users after 20-30 minutes.
});

Comme cela prend 20-30 minutes, cela ressemble au délai d'expiration de la session par défaut:

services.AddSession(options =>
{
    options.Cookie.Expiration = TimeSpan.FromDays(1); // This throws an error "Expiration cannot be set for the cookie defined by SessionOptions"
    options.IdleTimeout = TimeSpan.FromDays(1); // This changes session sliding expiration time... 
});

La même implémentation a bien fonctionné dans ASP.NET Core 1.1.

11
Shaltukaz

Ok, alors j'ai spammé différents forums à ce sujet :) Et voici mes découvertes. Original https://github.com/aspnet/Identity/issues/1389

Il semble y avoir un grand fossé dans ma compréhension de la façon dont tout cela fonctionne. J'ai aussi constaté que j'ai menti un peu. Donc, pour finir pour d'autres aussi stupides que moi.

services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();
services.Configure<SecurityStampValidatorOptions>(options => options.ValidationInterval = TimeSpan.FromSeconds(10));
services.AddAuthentication()
    .Services.ConfigureApplicationCookie(options =>
    {
        options.SlidingExpiration = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
    });

Selon ma compréhension, cela fonctionne comme ceci:

  • la vérification si l'utilisateur est connecté a lieu toutes les 10 secondes environ, en fonction du ratio de demandes. Le serveur vérifie les timbres de sécurité à chaque demande adressée au serveur options.ValidationInterval = TimeSpan.FromSeconds(10)).

  • le cookie est valide au minimum pendant 30 minutes options.ExpireTimeSpan = TimeSpan.FromMinutes(30);, mais peut être prolongé avec options.SlidingExpiration = true; si la page est actualisée ou consultée.

  • important! ne soyez pas trop "intelligent" comme moi et ne lancez pas _userManager.UpdateSecurityStampAsync(user); juste après une connexion réussie. Parce que cela met à jour le timbre de sécurité et que la validation suivante échouera.

10
Shaltukaz

S'il vous plaît voir ce sujet il vous aide à faire vivre la session pendant longtemps.

Keep Session Live

0
Nripendra Ojha

Je ne suis pas un expert, et je suis certain que ce message le révélera, mais j'ai déjà eu ce problème avant d'exécuter des versions antérieures d'ASP.NET (Web Forms) sur IIS.

Le problème était que IIS avait ses propres paramètres de délai d'expiration de session, définis sur le serveur lui-même. Autant que je sache, ils ne peuvent en aucun cas être remplacés par ce que vous avez configuré sur votre site avant le déploiement.

Cela est particulièrement utile pour les serveurs partagés qui utilisent ASP.NET Web Forms: ils ne veulent pas que les utilisateurs de leurs clients accumulent des données de session qui sait quoi faire et doivent les conserver indéfiniment.

Utiliser les appels AJAX pour garder la session en vie devrait fonctionner, je pense.

0
user3433178

Le serveur conserve une session pendant une durée limitée après la dernière demande. Vous pouvez définir le délai d'expiration de la session ou utiliser la valeur par défaut de 20 minutes.

Pour modifier la valeur par défaut, modifiez la méthode ConfigureServices.

public void ConfigureServices(IServiceCollection services)
    {
        ....
        services.AddSession(options => { 
                options.IdleTimeout = TimeSpan.FromMinutes(30); 
                options.CookieName = ".MyApplication";
            });
    }
0
Chris Hawkes