5

我正在開發一個ASP.Net MVC 3 Web應用程序與實體框架4.當用戶登錄到我的應用程序,我想存儲他們的用戶實體(名,姓等)在一個可以在整個應用程序中訪問的會話。ASP.Net MVC商店用戶實體在會話

據我所知,這可能不是一個好主意,因爲當ObjectContext關閉/配置時,用戶實體被分離,用戶細節可能丟失。

我想另一種方法可能是,當用戶登錄時,用戶ID(主鍵)分配給一個會話變量,即:

HttpContext.Current.Session["currentUserID"] = user.userID; 

在UserService類,像這樣然後創建一個類:

public static User CurrentUser 
    { 

     get 
     { 
      return Data.DBEntities.Users.Where(u => u.userID == HttpContext.Current.Session["currentUserID"]).FirstOrDefault(); 
     } 

    } 

應該根據currentUserID會話變量返回一個用戶實體。這不是爲我工作然而,我得到一對夫婦的錯誤

Cannot convert lambda expression to type 'string' because it is not a delegate type 
Delegate 'System.Func<Asset.Model.User,int,bool>' does not take 1 arguments 

的是這種方法我正在正確的,或者是有沒有更好的辦法?

任何反饋將不勝感激。

回答

9

首先,不要在Session中存儲安全敏感信息。谷歌「ASP.NET會話劫持」瞭解爲什麼。

也就是說,這段代碼可以工作。你只是有一個轉換錯誤。此外,您沒有考慮到Session可以和在登錄期間到期的事實。你可以這樣做:

public static User CurrentUser 
{ 
    get 
    { 
     object userID = HttpContext.Current.Session["currentUserID"]; 
     if (userID == null) 
     { 
      throw new InvalidOperationException("Oops!"); 
     } 
     return Data.DBEntities.Users.Where(u => u.userID == (int)userId).FirstOrDefault(); 
    } 
} 

......它至少編譯,但不安全,有時會拋出。

將用戶標識存儲在custom principal上會更好,該用戶標識安全且不會過期。

+0

感謝您的反饋。 – tgriffiths 2011-02-15 20:23:02

0

您可以在Session中存儲整個實體。它將被分離,但並不意味着它會丟失值 - 只有在延遲加載的情況下,您才能夠延遲加載導航屬性。

在您當前的代碼中,嘗試將currentUserId設置爲臨時變量並在查詢中使用該變量。

+1

除了我在答覆中已經提到的兩個問題,如果您(1)切換到分佈式會話存儲並且(2)具有任何不可序列化的屬性,則會帶來額外的風險,即您的應用在運行時可能會失敗。也就是說,我認爲「不安全和不可靠」是足夠的理由,即使沒有額外的風險,也不要將其放在「Session」中。 `Session`是用戶特定的緩存,而不是通用的安全數據存儲。 – 2011-02-14 13:09:13