2009-11-10 59 views
3

我有我自己的asp.net的cookie是這樣創建的:解密cookie是否將其轉換爲當地時間?

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時間?

回答

3

MSDN

FormsAuthenticationTicket.Expiration物業

獲取當地日期及Forms身份驗證票證過期時間。

可以使用DateTime.ToUniversalTime方法爲DateTime轉換爲UTC:

return ticket.Expiration.ToUniversalTime().Ticks; 
0

正如你所看到的,一旦的FormsAuthenticationTicket已經系列化,以一個cookie和反序列化,將過期和發行時間將永遠是本地的。

MSDN中的備註部分顯示「如果FormsAuthenticationTicket是使用帶有過期參數的構造函數創建的,則Expiration屬性返回提供給過期參數的值。」因此,如果你通過UTC,你會得到UTC直到票已被序列化/反序列化,之後它將被轉換爲本地。

如果您向構造函數提供issueDate和expiration,它們通常應該在本地時間。但是沒有嘗試將它們轉換爲本地時間 - 可能原因是爲了向後兼容.NET 1.x.

在.NET 1.x中,DateTime結構沒有「Kind」屬性,所以無法告訴它調用者提供的UTC或本地時間 - 它只是假定爲本地的。

因此,我建議您更改您的代碼以將當地時間傳遞給FormsAuthenticationTicket構造函數,但它確實會將您暴露給this bug recorded on Microsoft Connect

+0

嗯。但本地時間將是服務器時間。難道還沒有更好的通過UTC時間嗎?我做了什麼dtb,並將其轉換回UTC時間,即使我猜它沒有什麼區別。 – chobo2 2009-11-11 20:04:47

相關問題