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

Sha*_*kaz 12 c# asp.net cookies session 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();
...
}
Run Code Online (Sandbox Code Playgroud)

问题是用户只能保持登录状态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.
});
Run Code Online (Sandbox Code Playgroud)

由于需要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... 
});
Run Code Online (Sandbox Code Playgroud)

ASP.NET Core 1.1中的相同实现工作正常.

Sha*_*kaz 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);
    });
Run Code Online (Sandbox Code Playgroud)

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

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

  • cookie至少有效30分钟options.ExpireTimeSpan = TimeSpan.FromMinutes(30);,但options.SlidingExpiration = true;如果页面刷新或导航,则可以延长.

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


Chr*_*kes 1

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

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

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