2011-12-27 82 views
6

我知道會員提供商將用戶名和過期時間存儲在加密的cookie中,然後使用它來驗證用戶是否仍然登錄進行會話。ASP.Net在會話cookie中存儲用戶密碼?

是否可以將用戶密碼存儲在此加密的cookie中。如果是的話,你將如何訪問它的服務器端?

我需要用戶的用戶名和密碼可用的服務器端,因爲我需要調用Web服務使用這些相同的憑據。有沒有更好的方法來做到這一點?

回答

10

您應該將其存儲在會話狀態中,永遠不會離開服務器。

您還應該嘗試將這些Web服務更改爲使用身份驗證票證而不是密碼(例如OAuth),因爲以純文本存儲密碼絕不是一個好主意。

+2

當我第一次驗證用戶時,會將它們保存到會話狀態嗎?您如何確保會員會話與會話狀態同時過期?我相信,我需要他們保持同步。 – 2011-12-27 03:53:58

+0

@metalideath - 是的,儘快將它們儲存起來。如果會話結束,無論是由用戶清除其cookie(並因此丟失對會話的任何引用)或服務器超時會話,您需要重新驗證用戶身份並再次在會話中恢復密碼。 – Omar 2011-12-27 05:21:05

+0

會話狀態在多服務器環境中工作嗎? – 2011-12-27 23:05:10

2

不推薦,但可以使用FormsAuthenticationTicket.UserData

+0

據我所知,這不是SLak推薦的東西嗎?我不太瞭解會員提供的會話和「會話狀態」之間的區別。也許沒有什麼區別,那就是讓我困惑的東西。 – 2011-12-27 05:35:35

+0

@metalideath。 Session Cookie與Forms Authentication Cookie非常不同。閱讀Stefan Schackow書的「Forms Authentication」章節以獲得完整的理解。 – 2011-12-27 05:42:46

+0

@metalideath:這直接進入客戶端上的表單身份驗證cookie。我不會推薦它。 – SLaks 2011-12-27 13:42:36

3

是的,你可以做到這一點。您傳入的FormsAuthenticationTicket構造函數的用戶數據領域的編碼信息:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(version, 
    name, issueDate, expirationDate, isPersistent, yourEncodedData); 
    string secureTicket = FormsAuthentication.Encrypt(ticket); 
    Response.Cookies.Add(
     new HttpCookie(FormsAuthentication.FormsCookieName, secureTicket)); 

理想的情況下,這應該通過SSL連接來完成,而票餅乾應與中HTTPOnly和安全屬性標記。

然後,檢索值:

FormsIdentity id = (FormsIdentity)User.Identity; 
FormsAuthenticationTicket ticket = id.Ticket; 
string yourEncodedInfo = ticket.UserData; 

你也可以只設置自己的cookie,從窗體身份驗證票證分開。

但是,從安全角度來看,即使加密,直接在cookie中存儲密碼也不是一個好主意。相反,使用會話狀態:

Session["password"] = password; 

會話狀態也使用cookie,但cookie本身只包含密鑰。服務器使用密鑰來獲取該會話唯一的鍵/值對的字典,該字典保留在服務器上(或者根據配置如何序列化到數據庫)。

+0

感謝您使用會話狀態的示例,+1 。 – 2013-08-09 16:06:03