Пользователь всегда должен войти в систему через 20-30 минут

Независимо от того, что я пробовал, я не могу увеличить время, необходимое для входа в систему, более чем на 20-30 минут. Это даже в том случае, если пользователь постоянно активен - так что это не просто время простоя, это максимальное время между входами в систему. Через 20 минут пользователь перенаправляется на страницу входа для повторного входа.

Странно то, что когда я уменьшаю CookieOptions.ExpireTimeSpan примерно до 10 секунд, он перенаправляется через 10 секунд, как и ожидалось. Я также протестировал SlidingExpiration, и он тоже работает - при использовании более низкого ExpireTimeSpan все, что больше 20/30 минут, похоже, не работает.

Я подумал, что это может иметь какое-то отношение к настройкам пула приложений моего хост-сервера. Возможно, пул приложений умирает через 20 минут, что приводит к недействительности входа в систему, но это происходит даже тогда, когда я запускаю приложение прямо из Visual Studio.

Честно говоря, у меня нет идей, и я даже не знаю, как отладить это, если это проблема с файлами cookie. Я был бы очень признателен за любую помощь, даже если есть способ прочитать значение ExpireTimeSpan в файле cookie после входа в систему.

Это мой код в настоящее время при запуске:

    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
        app.UseDeveloperExceptionPage();
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseAuthentication();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
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);
            }
       }
   }

Буду очень признателен за любые подсказки! Спасибо!


person frezq    schedule 14.07.2019    source источник
comment
Нет никаких очевидных проблем с вашими кодами, также если loginFormModel.RememberMe (isPersistent) имеет значение false, ConfigureApplicationCookie не будет работать, он по умолчанию выдаст файл cookie сеанса.   -  person Nan Yu    schedule 15.07.2019
comment
@NanYu Сеансовые куки-файлы должны сохраняться на протяжении всего сеанса браузера, нет? Таким образом, он должен оставаться в течение часа, если для ExpireTimeSpan установлено это значение.   -  person frezq    schedule 16.07.2019


Ответы (1)


См. Аналогичную проблему здесь и отчет об ошибке здесь.

Короче говоря, это ошибка в ASP.NET Core 2.1, если вы реализуете свой собственный IUserStore, но не реализуете IUserSecurityStampStore, пользователь выходит из системы через 30 минут, даже если срок хранения файлов cookie не истек.

Быстрое исправление - увеличить проверку штампа безопасности до достаточно безопасного значения, например:

services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromHours(10));
person frezq    schedule 17.07.2019