asp.net-core2.0用户自动注销20-30分钟后

时间:2017-08-22 19:36:59

标签: c# asp.net session cookies asp.net-core-2.0

几天前我决定将我的网络应用程序从asp.net核心1.1升级到核心2.0。除了身份验证不会持续超过20-30分钟之外,一切似乎都可以在轻微更改后正常工作。

我们可以从Visual Studio中获取默认示例,因为我在自己的webapp和“ASP.NET Core Web Application”中遇到了同样的问题 - > .NET Framework 4.6.1 + ASP.NET Core 2.0 + MVC +个人用户帐户

配置是默认设置,应该是用户登录14天:

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();
...
}

问题是用户只能保持登录状态20-30分钟。当用户登录(选择“记住我”)时,您可以浏览页面,甚至重新打开浏览器,用户保持登录状态。因此,验证cookie似乎正常工作。但是,20-30分钟后用户会自动注销,或者我应该说cookie过期(我不知道会发生什么)。你可以再次登录,游戏又重新开始。

我已尝试设置应用程序Cookie过期,但这并不能解决问题:

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

由于需要20-30分钟,它看起来像默认会话超时:

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

相同的实现在ASP.NET Core 1.1中运行良好。

4 个答案:

答案 0 :(得分:10)

好的,然后我发了关于这个垃圾邮件的不同论坛:)这是我的发现。原https://github.com/aspnet/Identity/issues/1389

我对这一切的运作方式的理解似乎存在很大差距。我还发现我撒谎了一点。所以像我这样完成其他愚蠢的事。

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

根据我的理解,这样做是这样的:

  • 检查用户是否记录〜每10秒发生一次,具体取决于请求比率。服务器在每次向服务器options.ValidationInterval = TimeSpan.FromSeconds(10))发送请求时都会检查安全标记。

  • Cookie至少有效30分钟options.ExpireTimeSpan = TimeSpan.FromMinutes(30);,但如果页面已刷新或导航,则可以options.SlidingExpiration = true;进行扩展。

  • 重要!不要像我一样太“聪明”,并且在成功登录后不要运行_userManager.UpdateSecurityStampAsync(user);。因为这会更新安全标记,下一次验证验证将失败。

答案 1 :(得分:0)

服务器在最后一次请求后的有限时间内保留会话。您可以设置会话超时或使用默认值20分钟。

要更改默认值,请编辑ConfigureServices方法。

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

答案 2 :(得分:0)

请参阅此主题,这有助于您长时间进行会话。

Keep Session Live

答案 3 :(得分:0)

我不是专家,我敢肯定这篇文章会揭示这一点,但是在IIS上运行旧版本的ASP.NET(Web窗体)之前,我遇到了这个问题。

问题是IIS在服务器本身上设置了自己的会话超时设置,并且AFAIK不能以任何方式被您在部署前在站点上配置的任何设置所覆盖。

这对于提供ASP.NET Web表单的共享服务器尤其有意义-他们不希望其客户的用户积累多少会话数据并且必须无限期地保持可用状态。

我认为使用AJAX调用使会话保持活动状态应该可以。