Я настроил веб-сервер 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, который я вижу из браузера:
Выглядит нормально ... Обратите внимание, что эта информация о файлах cookie поступает из сеанса браузера, который "выписан" (странно?)