.NET Core 2 CookieAuthentication игнорирует срок действия истечения - PullRequest
0 голосов
/ 03 июня 2018

Я работаю над веб-приложением .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 с удостоверением

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

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Использование 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
          });
0 голосов
/ 14 марта 2019

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

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_2_1);
0 голосов
/ 03 июня 2018

С Использовать проверку подлинности с использованием cookie без идентификатора ядра ASP.NET , выделено жирным шрифтом для выделения.

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

...