2009-11-28 59 views
2

當我建立需要用戶登錄asp.net應用程序,我在businees類,如果用戶登錄返回成員對象實例寫一個方法,空如果不是。然後,我這樣做:凡用戶登錄信息存儲在asp.net

Session["User"] = user; 

然後在每個頁面加載我要實現這一點:

User user = Session["User"] as User; 
if(null==user){ 
//toggle the state of ascx, to show username/password boxes again, 
//Response.Redirect("somewhere else") etc... 
} 

這看起來像它的工作,但是這是一個好辦法? 因爲有時會話不返回該對象了。它發生在20分鐘之前,這是會話的默認超時。有沒有什麼共鳴?它會隨機發生,當我在測試過程中進行多次回發時。

在此先感謝。

回答

3

不能使用視圖狀態 - 它的範圍是當前頁面。 爲什麼你不使用表單身份驗證?它爲你做了所有這些工作,包括在數據庫中堅持用戶帳戶。

2

存儲在我的經驗的用戶信息在數據庫中的最佳方式。微軟通過SqlMembershipProvider來實現這一點很簡單。它給你一個預先定義的架構,與像存儲最佳實踐的密碼散列和與鹽(不是明文!)。這是一個好的開始,可定製。乾杯!

0

如果您使用的是默認的InProc會話狀態,它只會存儲在RAM中,所以它不僅可以在會話超時時消失,而且可以在應用程序池回收時發生,原因可能有很多(空閒超時,每天一次,內存過多使用等)。另外,每個頁面都會鎖定會話狀態,因此如果您的應用嘗試一次執行多個訪問,則可能會遇到問題。

有多大你的用戶對象?如果它不是太大,你可能會考慮將數據存儲在cookie中,而不是會話狀態。 Silverlight隔離存儲是另一種選擇。否則,您可以將其保留在數據庫中並執行您自己的緩存管理。這比使用會話詞典更有效....

我要補充一點,如果你可以使用內置的會員供應商,它簡化了一些這方面的東西,但我假設你有你不走這條路線的原因 - 這絕對不是一種萬能的解決方案。