.NET Core 2 CookieAuthentication игнорирует срок действия

Я работаю над веб-приложением .NET Core 2.1 с CookieAuthentication. По какой-то причине установка ExpireTimeSpan и Cookie.Expiration для объекта CookieAuthenticationOptions не влияет на время жизни Cookie. Chrome всегда отображает одну и ту же дату истечения срока действия 1969-12-31T23:59:59.000Z. Таким образом, после закрытия окна браузера файл cookie исчезает.

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
   services.AddDistributedMemoryCache();

   services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
      .AddCookie(options =>
      {
         options.LoginPath = new PathString("/Account/Login/");
         options.AccessDeniedPath = new PathString("/Account/Login/");
         options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
         options.Cookie.Expiration = TimeSpan.FromDays(14);
         options.ExpireTimeSpan = TimeSpan.FromDays(14);
      });

   services.AddMvc(options =>
   {
      options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
   });

   services.AddAntiforgery(options => options.HeaderName = "X-CSRF-TOKEN");
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
   if (env.IsDevelopment())
   {
      app.UseBrowserLink();
      app.UseDeveloperExceptionPage();
   }
   else
   {
      app.UseExceptionHandler("/Error");
   }

   var provider = new FileExtensionContentTypeProvider();
   provider.Mappings[".tag"] = "riot/tag";

   app.UseStaticFiles(new StaticFileOptions()
   {
      ContentTypeProvider = provider
   });

   app.UseAuthentication();

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

При входе я использую этот код

ClaimsPrincipal user = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, userId.Value.ToString()) }, CookieAuthenticationDefaults.AuthenticationScheme));
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user);

Я пытался поставить services.AddMvc перед services.AddAuthentication, но это не имеет значения. Я также пробовал services.ConfigureApplicationCookie после services.AddAuthentication, как в этом ответе Срок действия файла cookie в ASP.NET Core 2.0 с идентификацией

Что мне не хватает?


person d03090    schedule 03.06.2018    source источник


Ответы (4)


Используйте IsPersistent = true.

Пример

var claims = new List<Claim>
{
    new Claim(ClaimTypes.NameIdentifier, client.Id),
    new Claim(ClaimTypes.Role, client.Role)
};

var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
          new ClaimsPrincipal(identity),
          new AuthenticationProperties
          {
              ExpiresUtc = DateTime.UtcNow.AddYears(1),
              IsPersistent = true
          });
person Fatih Erol    schedule 03.06.2018
comment
Я бы также рекомендовал добавить MinimumSameSitePolicy = SameSiteMode.Lax, если вы хотите отключить стороннее использование файла cookie и предотвратить атаки CSRF. - person momo; 05.06.2018

Дата истечения срока действия в Chrome представляет собой время жизни файла cookie в браузере, а не время ожидания токена. При использовании Identity Server 4 с ASP.NET Identity здесь играет роль тайм-аут файла cookie сервера Identity. По истечении срока действия токена клиента пользователь повторно аутентифицируется на сервере Identity Server, и, поскольку срок действия этого токена еще не истек, токен клиента обновляется. Чтобы установить время истечения срока действия на Identity Server, вы должны добавить ПО промежуточного слоя ConfigureApplicationCookie в Startup.cs Identity Server следующим образом:

services.AddAuthentication();

services.ConfigureApplicationCookie(options =>
    {
        options.Cookie.Expiration = TimeSpan.FromDays(14);
        options.ExpireTimeSpan = TimeSpan.FromDays(14);
        options.SlidingExpiration = false;
   });
 
services.AddMvc().SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version
services.AddAuthentication();

services.ConfigureApplicationCookie(options =>
    {
        options.ExpireTimeSpan = TimeSpan.FromDays(14);
        options.SlidingExpiration = false;
   });
 
services.AddMvc();
1);

Обновление для .net core 3.1 (cooke.expiration больше не требуется как отдельная опция):

services.AddAuthentication();

services.ConfigureApplicationCookie(options =>
    {
        options.ExpireTimeSpan = TimeSpan.FromDays(14);
        options.SlidingExpiration = false;
   });
 
services.AddMvc();
person Michael Armitage    schedule 13.03.2019
comment
Кажется, это неправильный ответ. Я получаю сообщение об ошибке: Cookie.Expiration игнорируется, вместо этого используйте ExpireTimeSpan - person Simon; 13.08.2020
comment
Извините, я обновил для .net 3.1 - person Michael Armitage; 17.12.2020

From Использовать проверку подлинности с помощью файлов cookie без ASP.NET Core Identity , выделено жирным шрифтом для акцента.

TimeSpan, после которого истекает срок действия билета проверки подлинности, хранящегося в файле cookie. ExpireTimeSpan добавляется к текущему времени, чтобы создать время истечения срока действия билета. Значение ExpiredTimeSpan всегда входит в зашифрованный AuthTicket, проверенный сервером. Он также может быть указан в заголовке Set-Cookie, но только в том случае, если установлен параметр IsPersistent. Чтобы задать для параметра IsPersistent значение true, настройте параметры AuthenticationProperties, переданные в SignInAsync. Значение по умолчанию для ExpireTimeSpan — 14 дней.

person Mark G    schedule 03.06.2018

Identity имеет специальные параметры конфигурации файлов cookie. CookieAuthenticationOptions и значение срока действия файлов cookie было решено игнорировать. Некоторые пояснения можно найти здесь: Проблема Github Ссылка на тест

person Tomasz Majewski    schedule 02.09.2020