Возникли проблемы с сохранением входа пользователя в систему после публикации на хосте. - PullRequest
0 голосов
/ 09 февраля 2020

После того, как я опубликовал sh мой код в локальном iis cook ie, он остается активным в течение 1 месяца, как настроено в коде, но после публикации его на хосте, cook ie остается живым только в течение 20 минут. Я использую общий хост. Вот как я настроил cook ie:

services.AddAuthentication()
              .AddCookie(cookieSettings.MemberCookieScheme, options =>
              {
                  options.Cookie.Name = cookieSettings.MemberCookieScheme;
                  options.LoginPath = "/Profile/Login";
                  options.LogoutPath = "/Profile/Logout";
                  options.SlidingExpiration = true; 
                  options.ExpireTimeSpan = TimeSpan.FromDays(30);
                  options.Cookie.Expiration = TimeSpan.FromDays(30);
              });

И этот код для входа пользователей:

await HttpContext.SignInAsync(_siteSettings.CookieSettings.MemberCookieScheme, principalMember,
                new AuthenticationProperties { IsPersistent = true });

Ответы [ 2 ]

1 голос
/ 09 февраля 2020

Это проблема с общим хостом.

По умолчанию время ожидания простоя в IIS составляет 20 минут.

  1. Если у вас есть доступ к серверу, вам нужно увеличить или отключите
    время ожидания в пуле приложений в IIS.
  2. Если у вас нет доступа к веб-серверу, вы можете создать новую конечную точку в вашей программе под названием HeartBeat или HealthCheck и в течение 20 минут позвонить этот API для предотвращения завершения.

Поиск по ним:

  • Предотвращение прекращения простоя IIS.

  • Вызов Проверка работоспособности автоматически ASP. NET Core

0 голосов
/ 11 февраля 2020

Я наконец нашел ответ. Я создал BackgroundService, в котором есть таймер, и каждые 10 минут он отправляет запрос на мой URL-адрес для увеличения времени ожидания сеанса.

 public class ExtendLoginHostedService : IHostedService, IDisposable
    {
        private Timer _timer;        
        private readonly ILogger<ExtendLoginHostedService> _logger;

        public ExtendLoginHostedService(ILogger<ExtendLoginHostedService> logger)
        {
            this._logger = logger;
        }

        public Task StartAsync(CancellationToken stoppingToken)
        {
            _logger.LogInformation("ExtendLogin Hosted Service running.");

            _timer = new System.Threading.Timer(async (ev) =>
            {
                DoWorkAsync(stoppingToken);

            }, null, TimeSpan.Zero, TimeSpan.FromMinutes(10));

            return Task.CompletedTask;
        }

        private void DoWorkAsync(CancellationToken cancellationToken)
        {
            using (WebClient client = new WebClient())
            {
                using (Stream stream = client.OpenRead("https://your-site.com"))
                {
                    // This part is just for making sure that currect data has received or not
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        Console.WriteLine(reader.ReadToEnd());
                    }
                }
            }
        }

        public Task StopAsync(CancellationToken stoppingToken)
        {
            _logger.LogInformation("ExtendLogin Hosted Service is stopping.");

            _timer?.Change(Timeout.Infinite, 0);

            return Task.CompletedTask;
        }

        public void Dispose()
        {
            _timer?.Dispose();
        }

и регистрирует его в StartUp класс:

public IServiceProvider ConfigureServices(IServiceCollection services)
{        
     services.AddHostedService<ExtendLoginHostedService>();
}
...