我知道會員提供商將用戶名和過期時間存儲在加密的cookie中,然後使用它來驗證用戶是否仍然登錄進行會話。ASP.Net在會話cookie中存儲用戶密碼?
是否可以將用戶密碼存儲在此加密的cookie中。如果是的話,你將如何訪問它的服務器端?
我需要用戶的用戶名和密碼可用的服務器端,因爲我需要調用Web服務使用這些相同的憑據。有沒有更好的方法來做到這一點?
我知道會員提供商將用戶名和過期時間存儲在加密的cookie中,然後使用它來驗證用戶是否仍然登錄進行會話。ASP.Net在會話cookie中存儲用戶密碼?
是否可以將用戶密碼存儲在此加密的cookie中。如果是的話,你將如何訪問它的服務器端?
我需要用戶的用戶名和密碼可用的服務器端,因爲我需要調用Web服務使用這些相同的憑據。有沒有更好的方法來做到這一點?
您應該將其存儲在會話狀態中,永遠不會離開服務器。
您還應該嘗試將這些Web服務更改爲使用身份驗證票證而不是密碼(例如OAuth),因爲以純文本存儲密碼絕不是一個好主意。
不推薦,但可以使用FormsAuthenticationTicket.UserData。
據我所知,這不是SLak推薦的東西嗎?我不太瞭解會員提供的會話和「會話狀態」之間的區別。也許沒有什麼區別,那就是讓我困惑的東西。 – 2011-12-27 05:35:35
@metalideath。 Session Cookie與Forms Authentication Cookie非常不同。閱讀Stefan Schackow書的「Forms Authentication」章節以獲得完整的理解。 – 2011-12-27 05:42:46
@metalideath:這直接進入客戶端上的表單身份驗證cookie。我不會推薦它。 – SLaks 2011-12-27 13:42:36
是的,你可以做到這一點。您傳入的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本身只包含密鑰。服務器使用密鑰來獲取該會話唯一的鍵/值對的字典,該字典保留在服務器上(或者根據配置如何序列化到數據庫)。
感謝您使用會話狀態的示例,+1 。 – 2013-08-09 16:06:03
當我第一次驗證用戶時,會將它們保存到會話狀態嗎?您如何確保會員會話與會話狀態同時過期?我相信,我需要他們保持同步。 – 2011-12-27 03:53:58
@metalideath - 是的,儘快將它們儲存起來。如果會話結束,無論是由用戶清除其cookie(並因此丟失對會話的任何引用)或服務器超時會話,您需要重新驗證用戶身份並再次在會話中恢復密碼。 – Omar 2011-12-27 05:21:05
會話狀態在多服務器環境中工作嗎? – 2011-12-27 23:05:10