Срок действия файла cookie в ASP.NET Core 2.0 с удостоверением

Среда: ASP.NET Core 2.0, идентификация с файлами cookie.

В Startup.ConfigureServices() есть это:

services.ConfigureApplicationCookie(options => {
  options.ExpireTimeSpan = TimeSpan.FromDays(14);
  options.Cookie.Expiration = TimeSpan.FromDays(14);
});

Первый от CookieAuthenticationOptions. Второй от CookieBuilder. В документах также упоминается Microsoft.AspNetCore.Http.CookieOptions.Expires (хотя в этой лямбде он недоступен).

В чем разница между ними? Как правильно установить срок действия в Core2?


person grokky    schedule 25.08.2017    source источник


Ответы (2)


Ниже показано, что я использую для установки срока действия файла cookie в тестовом приложении, которое я использую.

public class Startup
{
    ...

    // This method gets called by the runtime. Use this method to add services to the container
    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        ...

        ...  // before services.AddMvc();!
        services.AddAuthentication().AddCookie(options => {
            options.Cookie.Expiration = TimeSpan.FromDays(14);
            options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Strict;
            options.Cookie.Name = "MyCookieName";
            options.LoginPath = "/Account/Login";
            options.AccessDeniedPath = "/Account/Forbidden";
        });

        // OR Perhaps, this could be what you need
        services.ConfigureApplicationCookie(options =>
        {
            options.Cookie.Expiration = TimeSpan.FromDays(150);
            options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Strict;
            options.Cookie.Name = "MyCookieName";
            options.LoginPath = "/Account/Login";
            options.AccessDeniedPath = "/Account/Forbidden";
        });
        ...
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        ... // before app.UseMvc();!
        app.UseAuthentication();
        // WAS -> app.UseCookieAuthentication();
        ...
    }
    ...
}

Думаю, это должно направить вас в правильном направлении.

Это работает для меня, и я пока не заметил никаких проблем. Хотя с момента выпуска Core 2.0 RTM прошло всего пару недель. :)

Надеюсь это поможет.

person R. Richards    schedule 25.08.2017
comment
Я использую options.ExpireTimeSpan = TimeSpan.FromDays(14); согласно одной из страниц на сайте документации. Но существование трех разных способов сделать это заставляет меня поверить, что между ними есть различия. Идентификация всегда была беспорядком (и никогда не документировалась должным образом), поэтому мне очень любопытно узнать больше об этой проблеме. Спасибо за ваше реальное подтверждение, это помогает! Я подозреваю, что есть разница в зависимости от того, когда вы используете файлы cookie с идентификацией или файлы cookie без идентификации - вы используете без, а я использую с, так что, возможно, где-то есть подсказка... - person grokky; 25.08.2017
comment
На самом деле, я использую Identity в своем проекте, я просто не включил это в код, так как не думал, что это актуально. Моя реализация Identity использует пользовательские классы пользователей/ролей и реализует настраиваемые хранилища для каждого из них. Я пытался понять, смогу ли я успешно избежать использования EF. Полный код, если здесь. - person R. Richards; 25.08.2017
comment
Это побочный вопрос, вы правы... хотя похоже, что вы дважды добавляете поддержку файлов cookie. По крайней мере, согласно страница документации для файлов cookie с идентификацией или без нее. В нем говорится, что вам нужно только AddIdentity() для аутентификации на основе файлов cookie, вам не нужно .AddAuthentication().AddCookie(...), - person grokky; 25.08.2017
comment
Я вижу, как это будет выглядеть, если я дважды добавлю поддержку файлов cookie. Я сделал то, что сделал, потому что не смог найти options.Cookie.Expiration в опциях AddIdentity. У меня не было жалоб/ошибок, поэтому я оставил это. Я могу покопаться в коде идентификации, чтобы увидеть, какие побочные эффекты это может вызывать, если таковые имеются. - person R. Richards; 26.08.2017
comment
Я добавил к этому кусок services.ConfigureApplicationCookie. Я проверил это. Я не заметил никаких изменений в поведении моих приложений, но это было не более чем дым и выход из системы/вход в систему. /src/Microsoft.AspNetCore.Identity/IdentityServiceCollectionExtensions.cs" rel="nofollow noreferrer">Подробнее. - person R. Richards; 26.08.2017
comment
Да, ConfigureApplicationCookie() я тоже этим занимаюсь... Хотел бы я, чтобы они как следует задокументировали все это. Документы сильно отстают от текущей версии. - person grokky; 26.08.2017
comment
Я получаю OptionsValidationException: Cookie.Expiration is ignored, use ExpireTimeSpan instead. - person Mugen; 12.02.2020

Этот код работает для меня. Только второй блок изменяет срок действия файла cookie

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options =>
        {
            // Cookie settings
            options.Cookie.HttpOnly = true;
            options.Cookie.SameSite = SameSiteMode.Strict;
            options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
            options.LoginPath = "/Account/Login";
            options.LogoutPath = "/Account/Logout";
            options.AccessDeniedPath = "/Account/AccessDenied";
        });

        services.ConfigureApplicationCookie(options =>
        {
            // Cookie settings, only this changes expiration
            options.Cookie.HttpOnly = true;
            options.Cookie.Expiration = TimeSpan.FromDays(150);
            options.ExpireTimeSpan = TimeSpan.FromDays(150);
        });
person Sergey Ostanevich    schedule 13.02.2018