Запомнить меня функциональность в ASP.NET Form Authentication не работает - PullRequest
9 голосов
/ 31 января 2011

Я использую проверку подлинности с помощью форм ASP.NET для входа пользователей на веб-сайт, который мы разрабатываем.

Часть функции - это флажок «Запомнить меня», который запоминает пользователя на месяц, если они проверяютit.

Код для входа пользователя в систему выглядит следующим образом:

public static void Login(HttpResponse response, string username,
  bool rememberMeChecked)
{
  FormsAuthentication.Initialize();
  FormsAuthenticationTicket tkt = new FormsAuthenticationTicket(1, username, DateTime.Now,
    DateTime.Now.AddMinutes(30), rememberMeChecked,
    FormsAuthentication.FormsCookiePath);
  HttpCookie ck = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(tkt));
  ck.Path = FormsAuthentication.FormsCookiePath;

  if (rememberMe)
    ck.Expires = DateTime.Now.AddMonths(1);

  response.Cookies.Add(ck);
}

Соответствующий раздел в файле web.config:

<authentication mode="Forms">
  <forms loginUrl="Home.aspx" defaultUrl="~/" slidingExpiration="true" timeout="43200" />
</authentication>

Этот журналпользователь в порядке, но выходит из системы через полчаса, если он не использует сайт, хотя его свойство постоянства (RememberMeChecked) имеет значение true, а если оно равно true, срок действия файла cookie истекает через месяц.Я что-то здесь упускаю?

Заранее спасибо, F

Ответы [ 5 ]

7 голосов
/ 31 января 2011

Похоже, ваш билет аутентификации по-прежнему настроен на истечение через полчаса, даже если срок действия самого файла cookie истекает через 30 дней.Возможно, вам также придется продлить срок действия билета:

public static void Login(HttpResponse response, string username,
    bool rememberMeChecked)
{
    DateTime expiration = DateTime.Now.AddMinutes(30);
    if (rememberMe) {
        expiration = DateTime.Now.AddMonths(1);
    }

    FormsAuthentication.Initialize();
    FormsAuthenticationTicket tkt = new FormsAuthenticationTicket(1, username,
        DateTime.Now, expiration, rememberMeChecked,
        FormsAuthentication.FormsCookiePath);

    HttpCookie ck = new HttpCookie(FormsAuthentication.FormsCookieName,
        FormsAuthentication.Encrypt(tkt));
    ck.Path = FormsAuthentication.FormsCookiePath;
    response.Cookies.Add(ck);
}
1 голос
/ 31 января 2011

Попробуйте установить атрибут Name тега forms в вашем web.config

Кроме того, Firecookie великолепен в устранении подобных проблем

Просто прочитав ваш код еще раз, вы также указали DateTime.Now.AddMinutes(30) в конструкторе билетов ... должны проверить, влияет ли это на

0 голосов
/ 31 января 2011

Я понял, что аутентификационный билет должен быть продлен, а не только прочитан.Мой метод Application_BeginRequest теперь выглядит следующим образом:

 if (!Request.IsAuthenticated)
  {
    HttpCookie ck = Request.Cookies[FormsAuthentication.FormsCookieName];

    if (ck != null)
    {
      FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(ck.Value);
      UserManagementUtils.RenewFormsAuthenticationTicket(Response, oldTicket);
    }
  }

Похоже, об этом позаботились.

0 голосов
/ 31 января 2011

Вы указали DateTime.Now.AddMinutes(30) в конструкторе для FormsAuthenticationTicket. Это то, что устанавливает срок действия логина.

0 голосов
/ 31 января 2011

Мне кажется, что вы проверяете "RememberMe", а не переменную, которую вы передали, "RememberMeChecked".

...