Entity framework 4 ASP.NETMVC存储会话中的用户实体

Entity framework 4 ASP.NETMVC存储会话中的用户实体,entity-framework-4,asp.net-mvc-3,entity,session-variables,Entity Framework 4,Asp.net Mvc 3,Entity,Session Variables,我正在用EntityFramework4开发一个ASP.NETMVC3Web应用程序。当用户登录到我的应用程序时,我希望将他们的用户实体(firstName、lastName等)存储在会话中,然后可以在整个应用程序中访问该会话 我理解这可能不是一个好主意,因为当ObjectContext关闭/处置时,用户实体被分离,用户详细信息可能会丢失 我认为另一种方法是,当用户登录时,将userID(主键)分配给会话变量,即: HttpContext.Current.Session["currentUser

我正在用EntityFramework4开发一个ASP.NETMVC3Web应用程序。当用户登录到我的应用程序时,我希望将他们的用户实体(firstName、lastName等)存储在会话中,然后可以在整个应用程序中访问该会话

我理解这可能不是一个好主意,因为当ObjectContext关闭/处置时,用户实体被分离,用户详细信息可能会丢失

我认为另一种方法是,当用户登录时,将userID(主键)分配给会话变量,即:

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
无法将lambda表达式转换为类型“string”,因为它不是委托类型
委托“System.Func”不接受1个参数
我采取的这种方法是正确的,还是有更好的方法


任何反馈都将不胜感激。

首先,不要在
会话中存储安全敏感信息。谷歌“ASP.NET会话劫持”了解原因

也就是说,这个代码可以正常工作。你只是有一个施法错误。此外,您没有考虑到
会话在登录期间可能会过期,并且确实会过期。您可以这样做:

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();
    }
}
…它至少可以编译,但不安全,有时会抛出


最好将用户ID存储在一个安全且不会过期的服务器上。您可以在会话中存储整个实体。它将被分离,但这并不意味着它将丢失值-只有在延迟加载的情况下,您才能延迟加载导航属性


在当前代码中,尝试将
currentUserId
设置为临时变量,并在查询中使用该变量

除了我在回答中已经提到的两个问题之外,如果您(1)切换到分布式会话存储,并且(2)具有任何不可序列化的属性,那么这还会增加应用程序在运行时失败的风险。也就是说,我认为“不安全和不可靠”是不把它放在
会话中的充分理由,即使没有额外的风险<代码>会话
是特定于用户的缓存,而不是通用的安全数据存储。