ASP.NET MVC-хранилище для пользователей в сеансе
Я разрабатываю веб-приложение ASP.Net MVC 3 с Entity Framework 4. Когда пользователь входит в мое приложение, я хотел бы сохранить его пользовательский объект (firstName, lastName и т.д.) в сеансе, который затем может быть доступен на протяжении всего выражение.
Я понимаю, что это не может быть хорошей идеей, потому что, когда ObjectContext закрывается/удаляется, пользовательский объект отделяется, и детали пользователя могут быть потеряны.
Я думал, что другой метод может быть, когда пользователь входит в систему, назначить идентификатор пользователя (первичный ключ) переменной сеанса, то есть:
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
Этот подход я принимаю правильно, или есть лучший способ?
Любая обратная связь будет высоко оценена.
Во-первых, не храните конфиденциальную информацию в Session
. Google "захват сеанса 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();
}
}
... который, по крайней мере, компилируется, но не защищен и иногда бросается.
Лучше сохранить идентификатор пользователя в настраиваемом главном, который безопасен и не истекает.
Вы можете хранить весь объект в сеансе. Он будет отсоединен, но это не значит, что он потеряет значения - только в случае ленивой загрузки вы не сможете ленивых навигационных свойств загрузки.
В текущем коде попытайтесь получить временную переменную currentUserId
и используйте эту переменную в запросе.