始终要求用户在20到30分钟后登录

时间:2019-07-14 14:44:28

标签: asp.net-core asp.net-identity asp.net-authentication

无论我尝试了什么,我似乎都无法将两次登录之间所需的时间增加不超过20到30分钟。即使用户一直处于活动状态,这也是如此-因此,这不仅仅是“空闲”时间,而是两次登录之间的最大时间。 20分钟后,用户将被重定向到登录页面以再次登录。

奇怪的是,当我将CookieOptions.ExpireTimeSpan减小到10秒左右时,它会按预期在10秒后重定向。我还测试了SlidingExpiration,它也可以工作-使用较低的ExpireTimeSpan,大于20/30分钟的任何内容似乎都不起作用。

我认为这可能与主机服务器的应用程序池设置有关。也许20分钟后应用程序池消失,导致登录无效,但是即使我直接从Visual Studio运行应用程序,也会发生这种情况。

老实说,我没有主意,如果这是Cookie问题,我什至不知道如何调试。我非常感谢您的帮助,即使有一种方法可以登录后读取Cookie上的ExpireTimeSpan值。

这是我当前在“启动”上的代码:

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => false;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        //services.AddSingletons, Transients etc..
        services.AddIdentity<IdentityUser, IdentityRole>()
              .AddDefaultTokenProviders();

        services.Configure<IdentityOptions>(options =>
        {
            // Password settings.
            // Lockout settings.
            // User settings.
        });

        services.ConfigureApplicationCookie(options =>
        {
            options.LoginPath = "/Login";
            //sliding expiration doesn't seem to work, nor does expiretimespan
            options.SlidingExpiration = true;
            options.ExpireTimeSpan = TimeSpan.FromHours(1);
        });

        services.AddMvc(config =>
        {
            var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
            config.Filters.Add(new AuthorizeFilter(policy));
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        services.AddHttpContextAccessor();
    }

我的配置:

        app.UseDeveloperExceptionPage();
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseAuthentication();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

我以此登录:

    [HttpPost]
    [Route("/Login")]
    [AllowAnonymous]
    public async Task<ActionResult> Login(string returnUrl, LoginFormModel loginFormModel)
    {
        returnUrl = returnUrl ?? Url.Content("~/");

        if (ModelState.IsValid) {
            // This doesn't count login failures towards account lockout
            // To enable password failures to trigger account lockout, set lockoutOnFailure: true
            var result = await _signInManager.PasswordSignInAsync(loginFormModel.Username, loginFormModel.Password, loginFormModel.RememberMe, lockoutOnFailure: true);
            if (result.Succeeded) {
                _logger.LogInformation("User logged in.");
                return LocalRedirect(returnUrl);
            }
       }
   }

真的很感谢任何提示!谢谢!

1 个答案:

答案 0 :(得分:2)

看到类似的问题here和错误报告here

简而言之,如果您实现自己的IUserStore而不实现IUserSecurityStampStore,则是ASP.NET Core 2.1中的一个错误,即使cookie没有过期,用户也会在30分钟后注销。

一个快速解决方案是将安全标记验证增加到一个足够安全的值,如下所示:

services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromHours(10));