tco*_*ode 5 entity session-variables entity-framework-4 asp.net-mvc-3
我正在使用Entity Framework 4开发一个ASP.Net MVC 3 Web应用程序.当用户登录我的应用程序时,我想将他们的用户实体(firstName,lastName等)存储在一个会话中,然后可以在整个应用程序中访问.
我知道这可能不是一个好主意,因为当ObjectContext关闭/处置时,User实体被分离,用户细节可能会丢失.
我认为另一种方法可能是,当用户登录时,将userID(主键)分配给会话变量,即:
HttpContext.Current.Session["currentUserID"] = user.userID;
Run Code Online (Sandbox Code Playgroud)
然后在UserService类中创建一个类,如下所示:
public static User CurrentUser
{
get
{
return Data.DBEntities.Users.Where(u => u.userID == HttpContext.Current.Session["currentUserID"]).FirstOrDefault();
}
}
Run Code Online (Sandbox Code Playgroud)
哪个应该基于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
Run Code Online (Sandbox Code Playgroud)
这种方法我采取的是正确的,还是有更好的方法?
任何反馈都将非常感激.
首先,不要存储安全敏感信息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();
}
}
Run Code Online (Sandbox Code Playgroud)
...至少编译,但不安全,有时会抛出.
最好将用户ID存储在自定义主体上,这是安全且不会过期的.
| 归档时间: |
|
| 查看次数: |
14369 次 |
| 最近记录: |