Преобразовывает ли файл cookie в местное время? - PullRequest
3 голосов
/ 10 ноября 2009

У меня есть свой собственный файл cookie asp.net, созданный так:

var authTicket = new FormsAuthenticationTicket(
    version,
    userName,
    DateTime.UtcNow,
    DateTime.UtcNow.AddMinutes(30),
    createPersistentCookie,
    userData,
    "/");

string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

Как видите, все в UTC.

Когда я расшифровываю это:

var cookie = HttpContext.Current.Request.Cookies.Get(FormsAuthentication.FormsCookieName);

if (cookie != null)
{
    var ticket = FormsAuthentication.Decrypt(cookie.Value);
    return ticket.Expiration.Ticks;
}
else
{
    return 0;
}

Возвращает местное время. Итак, он конвертируется автоматически или это что-то еще? Если так, как я могу вернуть его к времени UTC?

Ответы [ 2 ]

3 голосов
/ 10 ноября 2009

С MSDN :

Свойство FormsAuthenticationTicket.Expiration

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

Вы можете использовать DateTime.ToUniversalTime для преобразования DateTime в UTC:

return ticket.Expiration.ToUniversalTime().Ticks;
0 голосов
/ 10 ноября 2009

Как вы уже видели, после того, как FormsAuthenticationTicket был сериализован в cookie и десериализован, время истечения срока действия и выдачи всегда будет локальным.

В разделе «Примечания» в MSDN говорится «Если FormsAuthenticationTicket был создан с использованием конструктора, который принимает параметр expiration, свойство Expiration возвращает значение, указанное в параметре expiration.». Следовательно, если вы передадите UTC, вы будете возвращать UTC до тех пор, пока билет не будет сериализован / десериализован, после чего он будет преобразован в местный.

Если вы предоставляете IssueDate и expiration для конструктора, они обычно должны быть по местному времени. Однако не делается никаких попыток преобразовать их в местное время - возможно, причина этого в обратной совместимости с .NET 1.x.

В .NET 1.x структура DateTime не имела свойства «Kind», поэтому невозможно было сказать, что вызывающая сторона указала UTC или местное время - она ​​просто была принята как локальная.

Поэтому я предлагаю вам изменить свой код, чтобы передавать местное время конструктору FormsAuthenticationTicket, хотя он действительно подвергает вас этой ошибке, зарегистрированной в Microsoft Connect .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...