2012-01-19 166 views
1

我想製作一個ASP.NET MVC 3應用程序,其中我有自己的身份驗證系統。我跟隨了一些寫在this site上的帖子,我在另一篇SO帖子中發現了這些帖子。哪裏存儲用戶登錄信息?

大約在頁面的中途,作者寫了一個短會話管理器來保存用戶登錄信息。我顯然也想這樣做,但作者暗示這不是一種好的做事方式,而且還有其他更好的方式來做到這一點。

這一切都很好,但那些持續登錄信息的更好方法是什麼?

現在我堅持將用戶名,用戶ID和登錄狀態保存到會話中,因爲我需要經常提取用戶特定的信息,並且用戶名可以方便地快速訪問而不必重新輸入 - 在每個頁面上查詢數據庫。

+0

感謝您的所有答案。我希望我能標記多於1個的答案。 –

回答

3

會話這取決於你的需求。

會議:

  • 保存在服務器上,從而消耗服務器資源
  • 最安全的(沒有人可以修改會話數據)
  • 失去了當用戶關閉瀏覽器

的Cookie:

  • 保存在客戶端瀏覽器(do esn't消耗服務器資源)
  • 不太安全,因爲它是在客戶端PC和網絡(所以是加密的cookie,專門登錄信息的cookie)是一個好主意
  • 你可以通過不同的會話
  • 堅持它訪問

,當你有一個像問題一般來說「而不必重新查詢每一頁上的數據庫」問問自己,如果你可以使用ASP.Net Caching

1

我使用會話以及對我的應用程序和它的作品幾乎罰款在所有情況下,所以生病更喜歡餅乾或高速緩存

2

我使用FormsAuthentication和創建用戶票連接到它的序列化數據。這幾乎是一個cookie,但在.NET環境中得到很好的支持。

既然你提到了「自己動手」的解決方案,這就是我在這些情況下使用的。

這將創建一個FormsAuthentication票:

var authTicket = new System.Web.Security.FormsAuthenticationTicket(1, System.Web.Security.FormsAuthentication.FormsCookieName, DateTime.Now, DateTime.Now + System.Web.Security.FormsAuthentication.Timeout, false, this.Serialize(someObject)); 

var encrypt = System.Web.Security.FormsAuthentication.Encrypt(authTicket); 

var authCookie = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName, encrypt) { HttpOnly = true }; 
HttpContext.Current.Response.Cookies.Add(authCookie); 

這抓起票務信息:

var result = new FormsAuthenticationTicketData((HttpContext.Current.User.Identity as System.Web.Security.FormsIdentity).Ticket.UserData); 

有幾種方法,以序列化數據到餅乾,但我把它序列化到JSON敷上它在cookie中(對象必須能夠被序列化):

public string Serialize(object someObject) 
{ 
    var serializer = new JavaScriptSerializer(); 
    var output = serializer.Serialize(someObject); 

    return output; 
} 

要使用這些數據,您所要做的就是反序列化它。記住,你真正想要傳遞的這張票是一些標識數據,可以用來從你的控制器或你的AuthorizeAttribute覆蓋中提取「私人」信息。

希望有幫助!