ASP.Net MVC Store пользовательский объект в сеансе - PullRequest
5 голосов
/ 14 февраля 2011

Я занимаюсь разработкой веб-приложения ASP.Net MVC 3 с Entity Framework 4. Когда пользователь входит в мое приложение, я хотел бы сохранить его пользовательскую сущность (firstName, lastName и т. Д.) В сеансе, к которому затем можно получить доступ на протяжении приложение.

Я понимаю, что это не может быть хорошей идеей, потому что, когда ObjectContext закрывается / удаляется, сущность User отсоединяется, и детали пользователя могут быть потеряны.

Я думал, что другой метод может быть, когда пользователь входит в систему, назначить 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

Правильный ли это подход, или есть лучший способ?

Любая обратная связь будет принята с благодарностью.

Ответы [ 2 ]

9 голосов
/ 14 февраля 2011

Во-первых, не храните конфиденциальную информацию в Session. Google "ASP.NET Session угон" для получения информации о том, почему.

Тем не менее, этот код можно заставить работать. У вас просто ошибка приведения. Кроме того, Вы не учитываете тот факт, что 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();
    }
}

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

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

0 голосов
/ 14 февраля 2011

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

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

...