it-swarm.com.ru

автоматический выход пользователя из системы asp.net-core2.0 через 20-30 минут

Несколько дней назад я решил обновить свое веб-приложение с asp.net core 1.1 до core 2.0. После небольших изменений все работает нормально, за исключением того, что аутентификация не сохраняется дольше 20-30 минут. 

Мы можем взять пример по умолчанию из Visual Studio, потому что у меня такая же проблема в моем собственном веб-приложении и в «ASP.NET Core Web Application» -> .NET Framework 4.6.1 + ASP.NET Core 2.0 + MVC + Индивидуальный пользователь Счета .

Конфигурация по умолчанию и пользователи должны войти в систему в течение 14 дней:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();
...
    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
    app.UseAuthentication();
...
}

ПРОБЛЕМА заключается в том, что пользователь остается в системе только в течение 20-30 минут. Когда пользователь входит в систему (выбрано «Запомнить меня»), вы можете перемещаться по страницам и даже снова открывать браузер, пользователь остается в системе. Таким образом, кажется, что файл cookie аутентификации работает. Однако через 20-30 минут пользователь автоматически выходит из системы, или я должен сказать, что срок действия файлов cookie истек (я не знаю, что происходит). Вы можете войти снова, и игра начинается заново.

Я попытался установить срок действия файлов cookie приложения, но это не решает проблему: 

services.ConfigureApplicationCookie(options => {
    options.ExpireTimeSpan = TimeSpan.FromDays(1); // Just shortens cookie expiration time, but still logs out users after 20-30 minutes.
});

Поскольку это занимает 20-30 минут, это выглядит как время ожидания сеанса по умолчанию:

services.AddSession(options =>
{
    options.Cookie.Expiration = TimeSpan.FromDays(1); // This throws an error "Expiration cannot be set for the cookie defined by SessionOptions"
    options.IdleTimeout = TimeSpan.FromDays(1); // This changes session sliding expiration time... 
});

Та же самая реализация отлично работала в ASP.NET Core 1.1.

11
Shaltukaz

Хорошо, тогда я спамил на разных форумах по этому поводу :) А вот и мои открытия. Оригинал https://github.com/aspnet/Identity/issues/1389

Кажется, в моем понимании был большой пробел в том, как все это работает. Я также обнаружил, что я немного соврал. Таким образом, чтобы закончить для других, глупых, как я.

services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();
services.Configure<SecurityStampValidatorOptions>(options => options.ValidationInterval = TimeSpan.FromSeconds(10));
services.AddAuthentication()
    .Services.ConfigureApplicationCookie(options =>
    {
        options.SlidingExpiration = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
    });

Насколько я понимаю, это работает так:

  • проверка, зарегистрирован ли пользователь, происходит ~ каждые 10 секунд, в зависимости от соотношения запросов. Сервер проверяет штампы безопасности при каждом запросе к серверу options.ValidationInterval = TimeSpan.FromSeconds(10)).

  • cookie действителен как минимум в течение 30 минут options.ExpireTimeSpan = TimeSpan.FromMinutes(30);, но может быть расширен с помощью options.SlidingExpiration = true;, если страница обновлена ​​или перемещена.

  • важный! не будьте слишком «умными», как я, и не запускайте _userManager.UpdateSecurityStampAsync(user); сразу после успешного входа в систему. Потому что это обновляет штамп безопасности и следующая проверка не пройдёт.

10
Shaltukaz

Пожалуйста, ознакомьтесь с этой темой, это поможет вам сделать сессию живой в течение длительного времени.

Поддерживать сеанс в прямом эфире

0
Nripendra Ojha

Я не эксперт, и я уверен, что этот пост расскажет об этом, но у меня была эта проблема до запуска старых версий ASP.NET (веб-форм) в IIS.

Проблема заключалась в том, что IIS имеет свои собственные настройки времени ожидания сеанса, которые устанавливаются на самом сервере, и AFAIK они никоим образом не могут быть переопределены какими-либо настройками на вашем сайте перед развертыванием.

Это имеет смысл, особенно для разделяемых серверов, обслуживающих веб-формы ASP.NET - они не хотят, чтобы пользователи их клиентов накапливали данные сеанса «кто знает, сколько» и имели необходимость держать их доступными неограниченное время.

Я думаю, что использование вызовов AJAX для поддержания сеанса должно работать.

0
user3433178

Сервер сохраняет сеанс в течение ограниченного времени после последнего запроса. Вы можете установить время ожидания сеанса или использовать значение по умолчанию 20 минут.

Чтобы изменить значение по умолчанию, отредактируйте метод ConfigureServices.

public void ConfigureServices(IServiceCollection services)
    {
        ....
        services.AddSession(options => { 
                options.IdleTimeout = TimeSpan.FromMinutes(30); 
                options.CookieName = ".MyApplication";
            });
    }
0
Chris Hawkes