【问题标题】:asp.net-core2.0 user auto logoff after 20-30 minasp.net-core2.0 用户在 20-30 分钟后自动注销
【发布时间】:2018-01-31 05:09:56
【问题描述】:

几天前,我决定将我的网络应用从 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 分钟,因此看起来像默认会话超时:

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

【问题讨论】:

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


    【解决方案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);。因为这会更新安全标记,并且下一次验证验证将失败。

    【讨论】:

    • 我发现上面的代码不起作用。我的时间跨度从未设定。取而代之的是 services.AddAuthentication().AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =&gt; { options.ExpireTimeSpan = System.TimeSpan.FromMinutes(authenticationTimeOut); }); 就可以了。
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,我明白这一点,但它在核心 1.1 或 1.0 中更早地工作。他们是否删除了此功能?几天后我就可以通过网站继续使用了。
    • 不幸的是,我不确定他们何时或是否更改了它。
    • 谢谢你的例子。我试图将 idletimeout 设置为 60 分钟。但 20 分钟后 - 退出。所以要么我不能在这里更改会话超时,要么身份验证过程不依赖于会话。
    【解决方案3】:

    请参阅此主题,它有助于您使会话保持较长时间。

    Keep Session Live

    【讨论】:

      【解决方案4】:

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

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

      这对于服务于 ASP.NET Web 窗体的共享服务器来说尤其有意义——他们不希望客户的用户积累不知道有多少会话数据并且不得不无限期地保持它可用。

      我认为使用 AJAX 调用来保持会话活动应该可以工作。

      【讨论】:

      • 主题不是网络表单。 .NET Core 中有一些超时方法可以解决超时问题。例如,请参阅此线程中的 this link
      猜你喜欢
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2017-06-27
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多