ASP.NET MVC-хранилище для пользователей в сеансе

110
15

Я разрабатываю веб-приложение 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

Этот подход я принимаю правильно, или есть лучший способ?


Любая обратная связь будет высоко оценена.

спросил(а) 2021-01-19T21:12:22+03:00 6 месяцев, 1 неделя назад
1
Решение
140

Во-первых, не храните конфиденциальную информацию в 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();
}
}

... который, по крайней мере, компилируется, но не защищен и иногда бросается.


Лучше сохранить идентификатор пользователя в настраиваемом главном, который безопасен и не истекает.

ответил(а) 2021-01-19T21:12:22+03:00 6 месяцев, 1 неделя назад
46

Вы можете хранить весь объект в сеансе. Он будет отсоединен, но это не значит, что он потеряет значения - только в случае ленивой загрузки вы не сможете ленивых навигационных свойств загрузки.

В текущем коде попытайтесь получить временную переменную currentUserId и используйте эту переменную в запросе.

ответил(а) 2021-01-19T21:12:22+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема