Почему я должен повторно входить в систему каждый раз с этим процессом аутентификации - PullRequest
0 голосов
/ 07 ноября 2019

Я настроил веб-сервер ASP.Net Core 3.0 со следующей конфигурацией в Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpContextAccessor();
        services.AddControllers();

        services.AddIdentityServer(options =>
            {
                options.Authentication.CookieSlidingExpiration = true;
                options.Authentication.CookieLifetime = TimeSpan.FromDays(30);
            }
        )
        .AddInMemoryCaching()
        .AddClientStore<InMemoryClientStore>()
        .AddResourceStore<InMemoryResourcesStore>();

        services.AddAuthentication();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.ConfigureExceptionHandler();

        app.UseHttpsRedirection();
        app.UseFileServer();

        app.UseRouting();

        app.UseIdentityServer();
        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }

Вы можете видеть, что я установил срок действия файла cookie на 30 дней.

и вот код, который запускается при входе в систему с именем пользователя / паролем:

    [HttpGet("Signin")]
    public async Task<ActionResult<AccountResponse>> Signin([FromQuery]string email, [FromQuery]string password)
    {
        var (account, status) = accountRepository.AuthenticateAccount(email, password);
        if (status == AccountRepository.AuthenticateAccountStatusEnum.InvalidEmailPassword)
            return new ResponseBuilder<AccountResponse>().WithError("Invalid email/password").Build();
        else if (status == AccountRepository.AuthenticateAccountStatusEnum.AccountExternalProvider)
            return new ResponseBuilder<AccountResponse>().WithError("This email is not associated with a local account.").Build();
        else if (account.Status == AccountStatusEnum.WaitingForVerificationCode)
            return new ResponseBuilder<AccountResponse>(Mapper.Map<AccountResponse>(account))
                .WithMessage("This email address is still not verified.")
                .Build();
        else
            return await CompleteLogin(account);
    }

    private async Task<AccountResponse> CompleteLogin(AccountModel account)
    {
        await HttpContext.SignInAsync(account.Email, account.Email, new AuthenticationProperties { IsPersistent = true, ExpiresUtc = DateTime.UtcNow.AddDays(30) });

        return Mapper.Map<AccountResponse>(account).WithAuthenticated();
    }

Вы можете видеть, что я снова установил срок действия до 30 дней, а IsPersistent - значение true.

Все это работает хорошо. Если я войду в систему, закрою браузер и снова открою его, он все равно будет аутентифицирован.

Единственная ошибка в том, что если я войду в систему и оставлю время, скажем, ночью, я обновлю страницу ия больше не авторизован.

Что мне не хватает? Я хочу, чтобы пользователь оставался аутентифицированным в течение длительного времени (даже если он закрывает браузер, перезагружается и т. Д.).

Редактировать:

Вот файл cookie, который я вижу из браузера:

enter image description here

Выглядит нормально ... Обратите внимание, что эта информация о файлах cookie поступает из сеанса браузера, который "выписан" (странно?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...