Pracuję na aplikacji internetowej .NET Core 2.1 z CookieAuthentication. Z jakiegoś powodu ustawienie ExpireTimeSpan i Cookie.Expiration na obiekcie CookieAuthenticationOptions nie ma wpływu na żywotność cookie. Chrome zawsze wyświetla tę samą datę ważności 1969-12-31T23:59:59.000Z. Więc po zamknięciu okna przeglądarki cookie zniknęło.

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?}");
   });
}

na logowaniu używam tego kodu

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

Próbowałem umieścić services.AddMvc przed services.AddAuthentication, ale nie ma znaczenia. Próbowałem też services.ConfigureApplicationCookie po services.AddAuthentication jak w tej odpowiedzi Wygaśnięcie cookie w ASP.NET Core 2.0 z tożsamością

Czego mi brakuje?

4
d03090 3 czerwiec 2018, 23:24

3 odpowiedzi

Najlepsza odpowiedź

Użyj ispersistent = true

Przykład

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
          });
1
spottedmahn 4 czerwiec 2019, 18:10

Data ważności w Chrome reprezentuje żywotność plików cookie w przeglądarce, a nie limit czasu tokena. Podczas korzystania z serwera tożsamości 4 z tożsamości ASP.NET jest limitowanie plików cookie serwera tożsamości, w którym znajduje się tutaj. Po wygaśnięciu tokena klienta Użytkownik jest ponownie uwierzytelniony przed serwerem tożsamości i ponieważ token nie wygasł, że token klienta jest odnawiany. Aby ustawić czas wygaśnięcia na serwerze tożsamości, musisz dodać configureApplicationCookieMiddleware w uruchomieniu serwera tożsamości w następujący sposób:

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);
2
Michael Armitage 13 marzec 2019, 22:29

Z Użyj uwierzytelniania plików cookie bez tożsamości rdzenia ASP.NET, pogrubiony na nacisk.

Timespan po którym bilet uwierzytelniający przechowywany wewnątrz Cookie wygasa. ExpiretyMespan jest dodawany do aktualnego czasu, aby utworzyć Czas wygaśnięcia biletu. Wartość expreditimespan zawsze idzie do zaszyfrowanego authticket zweryfikowany przez serwer. może również Idź do nagłówka Set-Cookie, ale tylko wtedy, gdy jest ustawiony ISpersistent. , aby ustawić Ispersistent do prawdziwych, skonfiguruj uwierzytelnianiePropy SignSync. Domyślna wartość ExpiretyMespan wynosi 14 dni.

1
Mark G 3 czerwiec 2018, 20:52