2016-01-16 4 views
4

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

Я использую Javascript, чтобы определить, когда текущий сеанс находится в 60 секундах от тайм-аута, и если это так - выведите диалоговое окно с кнопкой, которая при нажатии будет расширять текущий билет FormsAuthentication.

Это код, который я использую для обновления билета. Я просто добавляю 5 минут к текущей дате истечения срока действия билета. Но когда я выдаю новую дату истечения срока действия, это всегда менее 5 минут; обычно 4 минуты и несколько секунд.

Код:

string userID = HttpContext.Current.User.Identity.Name; 
    HttpCookie cookie = FormsAuthentication.GetAuthCookie(userID, true); 

    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 

    DateTime NEW_EXPIRY = DateTime.Now.AddMinutes(FormsAuthentication.Timeout.Minutes); 

    FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(
     ticket.Version, 
     userID, 
     DateTime.Now, 
     NEW_EXPIRY, 
     ticket.IsPersistent, 
     ticket.UserData, 
     ticket.CookiePath); 

    cookie.Value = FormsAuthentication.Encrypt(newTicket); 

    if (ticket.IsPersistent) cookie.Expires = newTicket.Expiration; 

    cookie.Secure = FormsAuthentication.RequireSSL; 

    HttpContext.Current.Response.Cookies.Add(cookie); 

Итак, вот пример вывода из временных разниц:

Метка времени в настоящее время = 16/01/2016 14:03:28 билет истекает = 16/01/2016 14:07:49 (TOTAL SECONDS = 261.0857244)

Почему это не сбрасывает срок годности точно в 14:08:28 ?? Я ударяю головой о стену здесь ...

+0

Сайт работает локально или на сервере? – stuartd

+0

Я выхожу на конечность здесь - ваш код, возможно, занимает переменное количество секунд, чтобы получить свойство FormsAuthentication.Timeout? Возможно, из-за настройки IIS? Я предполагаю, что во время выполнения 'DateTime.Now' читается, тогда требуется некоторое время для инициализации и получения тайм-аута, после чего он добавляется в текущее время ... – Balah

+0

@stuartd - он работает локально, но делает то же самое на сервере – andym0908

ответ

0

Хорошо, поэтому я до сих пор не знаю, почему значение срока годности из объекта FormsIdentity неверно ... так что то, что я сделал, передано фактическим новым истечением значение (как DateTime) обратно из метода обновления и полагалось на это. Таким образом, кажется, что это значение является правильным, и это значение, которое я должен использовать, чтобы определить значение реального времени.

Это даже имеет смысл? Я не знаю, но сейчас он работает!