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

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

几天前,我决定将我的网络应用程序从 asp.net core 1.1 升级到 core 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 分钟,因此看起来像是默认 session 超时:

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 中运行良好。

最佳答案

好吧,那么我就此向不同的论坛发送了垃圾邮件 :) 这是我的发现。原创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);。因为这会更新安全戳,下一次验证验证将失败。

关于c# - asp.net-core2.0 用户在 20-30 分钟后自动注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45825684/

相关文章:

php - jQuery POST 多线程延迟

c# - 为什么在 switch case 语句中只允许使用有限的类型

c# - 选择行后弹出框不消失

c# - 将数组的所有元素添加到 datagridview 行,除了一个

javascript - 如何将 css 和 javascript 放在公共(public)库/元素中

ruby-on-rails - 设计记住我和 session

c# - Firefox 没有 Access-Control-Allow-Origin,但适用于 Chrome 和 Safari

c# - 如何从Azure AD获取asp net core 2.0 JwtBearer token 中的 key 名称

asp.net - 2-3 分钟后,asp.net 中的 session 即将关闭

React 中 Axios 调用时 API 中的 PHP-Session 发生变化