ASP.NET Core MVC: установка истечения срока хранения файла cookie

В моем приложении ASP.NET Core MVC срок жизни файла cookie для проверки подлинности установлен на "Сессия", поэтому он длится, пока я не закрою браузер. Я использую схему аутентификации по умолчанию для MVC:

app.UseIdentity();

Как продлить время существования файла cookie?

Ответ 1

Среднее промежуточное ПО ASP.NET Identity, которое вы используете, является wraper вокруг некоторых вызовов UseCookieAuthentication, который включает в себя промежуточное программное обеспечение для проверки подлинности cookie для конвейера. Это можно увидеть в исходном коде для расширений конструктора промежуточного ПО Identity здесь, на GitHub. В этом случае параметры, необходимые для настройки того, как должна работать базовая аутентификация Cookie, инкапсулируются в IdentityOptions и настраиваются при настройке инъекции зависимостей.

В самом деле, глядя на исходный код, с которым я связан, вы можете видеть, что при вызове app.UseIdentity() выполняется следующее:

var options = app.ApplicationServices.GetRequiredService<IOptions<IdentityOptions>>().Value;
app.UseCookieAuthentication(options.Cookies.ExternalCookie);
app.UseCookieAuthentication(options.Cookies.TwoFactorRememberMeCookie);
app.UseCookieAuthentication(options.Cookies.TwoFactorUserIdCookie);
app.UseCookieAuthentication(options.Cookies.ApplicationCookie);
return app;

Чтобы настроить класс IdentityOptions, метод AddIdentity<TUser, TRole> имеет одну перегруженную версию, которая позволяет настраивать параметры с помощью одной лямбда. Таким образом, вам просто нужно передать лямбду, чтобы настроить параметры. В этом случае вы просто получаете доступ к свойствам Cookies класса options и настраиваете ApplicationCookie по желанию. Чтобы изменить временной интервал, вы делаете что-то вроде

services.AddIdentity<ApplicationUser, IdentityRole>(options => {

    options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromHours(1);

});

EDIT: Свойство ExpireTimeSpan используется, только если при вызове HttpContext.Authentication.SignInAsync мы передаем экземпляр AuthenticationProperties с IsPersistent, установленным в true.

Пробовав только с помощью промежуточного ПО для проверки подлинности в cookie, выясняется, что это работает: если мы просто входим без этой опции, мы получаем файл cookie, который длится для сессии, если мы отправим это вместе, мы получим файл cookie, который длится, что мы при настройке промежуточного программного обеспечения.

С помощью ASP.NET Identity способ сделать - передать параметр IsPersistent PasswordSignInAsync со значением true. Это заканчивается вызовом SignInAsync HttpContext, проходящим в AuthenticationProperties с IsPersistent, установленным в true. Вызов заканчивается чем-то вроде:

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);

Где RememberMe - это то, что настраивается, если мы устанавливаем IsPersistent в true или false.

Ответ 2

Там ответ для версии 2.0, но это не сработало для меня. Я должен был сделать:

services.ConfigureApplicationCookie(options =>
{
    options.ExpireTimeSpan = TimeSpan.FromDays(30);
});

Значение по умолчанию - 14 дней.

Ответ 3

Try

app.UseIdentity().UseCookieAuthentication(
    new CookieAuthenticationOptions
    {
        ExpireTimeSpan = TimeSpan.FromHours(1)
    }
);

Ответ 4

По какой-то причине у меня возникла проблема при использовании SignInAsync([..], true) cookie никогда не отображался в браузере (и, соответственно, сбой входа):

Итак, я попробовал добавить разницу часовых поясов UTC в TimeSpan ExpireTimeSpan

services.AddIdentity<ApplicationUser, IdentityRole>(o =>
{
    // add TimeSpan with 5 minutes plus timezone difference from Utc time
    o.Cookies.ApplicationCookie.ExpireTimeSpan = DateTime.Now.Subtract(DateTime.UtcNow).Add( TimeSpan.FromMinutes(5) );

});

Voila! Он работал, и cookie отображается с истечением + 5 минут только в браузере.

PingBack to github.com https://github.com/aspnet/Identity/issues/766#issuecomment-253237576

Ответ 5

Для ASP.NET Core 2.0

  services.ConfigureApplicationCookie(options =>
        {
            options.Cookie.Name = "CookieName";
            options.Cookie.Expiration = TimeSpan.FromDays(2);
        });

Ответ 6

В ASP.NET Core 2.0 используйте свойство ExpireTimeSpan вместо Cookie.Expiration.

services.ConfigureApplicationCookie(options =>
{   
    options.Cookie.Name = "CookieName";         
    options.ExpireTimeSpan = TimeSpan.FromHours(24);
    options.SlidingExpiration = true;               
});

От docs:

Cookie.Expiration: возвращает или задает продолжительность жизни файла cookie. В настоящее время этот параметр no-ops и устареет в ASP.NET Core 2.1+. Используйте параметр ExpireTimeSpan для установки срока действия файла cookie.