Пользователь вышел из системы с помощью "Запомнить меня"

У меня возникли проблемы с пониманием того, как работают Identity 2.0 и cookie. ASP.NET MVC 5.

Что я хочу: если пользователь входит в систему и проверяет флажок "Запомнить меня", я не хочу, чтобы он когда-либо выходил из системы... Но происходит следующее: пользователь выходит из системы после определенного промежутка времени.

Функциональность "Запомнить меня" работает, если пользователь закрывает браузер раньше времени. (Когда он снова открывает сайт, он все еще вошел в систему.)

Вот код, который я имею для входа в систему:

 public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
 {
      if (!ModelState.IsValid)
      {
           return View(model);
      }

      // Require the user to have confirmed their email before they can log on.
      var user = await UserManager.FindByNameAsync(model.Email);
      if (user != null)
      {
           if (!await UserManager.IsEmailConfirmedAsync(user.Id))
           {
                await SendEmailConfirmationTokenAsync(user.Id);

                ModelState.AddModelError("", "Gelieve eerst je e-mailadres te bevestigen.");
                return View(model);
            }
      }

      // This doesn't count login failures towards account lockout
      // To enable password failures to trigger account lockout, change to shouldLockout: true
      var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: true);
      switch (result)
      {
           case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
           case SignInStatus.LockedOut:
                return View("Lockout");
           case SignInStatus.Failure:
           default:
                ModelState.AddModelError("", "Ongeldige aanmeldpoging.");
                return View(model);
      }
 }

И это код в Startup.Auth:

 app.UseCookieAuthentication(new CookieAuthenticationOptions
 {
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
      LoginPath = new PathString("/Account/Login"),
      ExpireTimeSpan = TimeSpan.FromMinutes(5),
      Provider = new CookieAuthenticationProvider
      {
           // Enables the application to validate the security stamp when the user logs in.
           // This is a security feature which is used when you change a password or add an external login to your account.

           OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>(
                validateInterval: TimeSpan.FromMinutes(10),
                regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
                getUserIdCallback: (id) => (id.GetUserId<int>()))
      }
 });

Поэтому я ожидаю, что пользователь не выйдет из системы через 5 минут, потому что в функции PasswordSignInAsync установлен флаг isPersistent.

Спасибо за любую помощь.

1 ответ

Это известная ошибка.

Это можно исправить, заменив SecurityStampValidator.OnValidateIdentity с вашим собственным кодом - когда файл cookie генерируется повторно, он забывает добавить свойство "RememberMe" в новый файл cookie, и это делает новый файл cookie не постоянным.

Я думаю, что это было решено в v2.2, но эта версия еще не запущена в производство. И, к сожалению, я не могу найти оригинальный отчет об ошибке для этого сейчас.

Другие вопросы по тегам