Где / как заполнить сеанс с пользователем, сохраненным в данных cookie в приложении MVC при первой загрузке? - PullRequest
4 голосов
/ 17 февраля 2012

У меня есть переменная сеанса, в которой хранится весь мой пользовательский объект, и когда человек входит на мой сайт с проверкой подлинности с помощью форм (используя вход в MVC по умолчанию), я назначаю переменную Session объекту пользователя следующим образом:

FormsAuthentication.SetAuthCookie(user.Username, model.RememberMe);
SessionUtil.User = user;

Все мои страницы настроены для работы с этим объектом Session, однако проблема возникает, когда они устанавливают флажок запомнить меня.Закройте их браузер, снова откройте браузер и снова зайдите на мой сайт.На этом этапе сеанс понятен, и они не вошли в систему, но мой сайт все еще помнит, кто они, однако все страницы, которые ссылаются на мой пользовательский объект в разрыве сеанса.

Я ищу способ заполнить пользовательский объект Session соответствующими данными, чтобы в приведенном выше сценарии объект сеанса не был пустым независимо от того, на какую страницу он попадал первым после того, как был «запомнен» после посещения моего сайта.,Где хорошее место для этого?В приложении запустить?В SessionUtil (сейчас это просто статическая оболочка для сеансовых переменных)?Базовый класс на контроллере?И как мне это сделать?У меня есть логика, написанная, чтобы отключить пользователя от имени пользователя.

Редактировать: Ну, application_start, похоже, не является хорошим местом, потому что делает это:

        if (User != null)
        {
            SessionUtil.User = EntityServiceFactory.GetService<UserService>().GetUser(User.Identity.Name);
        }

в методе не предотвращает возникновение проблемы.Я попытался сделать User.Identity.Name в проверке if, и затем я получил исключение нулевой ссылки, но я все еще помню и вошел в систему, когда страница действительно загружается.

Попробовал следующее в Global.asax для SplashКомментарий -X:

protected void Application_BeginRequest()
    {
        if(User != null)
        {
            SessionUtil.User = EntityServiceFactory.GetService<UserService>().GetUser(User.Identity.Name);
        }
    }

Это событие выполняет каждый запрос, но пользователь всегда равен нулю.Но я не получаю код _LogOnPartial по умолчанию:

@if(Request.IsAuthenticated) {
<text><strong>@User.Identity.Name</strong> [@Html.ActionLink("Profile", "Profile", "Account")]
[ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text>
}

все еще показывает, что я вошел в систему, а имя пользователя там хорошо.

1 Ответ

3 голосов
/ 17 февраля 2012

Вы определенно не хотите использовать application_start - он запускается только один раз, в начале ваше приложение раскручивается.То, что вы могли бы искать, это session_start, который будет запускаться при первом запросе нового сеанса:

void Session_Start(object sender, EventArgs e) {
  // set SessionUtil.User here
}

Я не думаю, что есть однозначный ответ, где ваш пользовательский объект должен быть обновлен.Если бы мне пришлось выбирать, я бы сделал это в вашем получателе SessionUtil.User.Что-то вроде этого (предупреждение, я не скомпилировал и не протестировал это)

public User User
{
    get
    {
        if (Session["user"] != null)
            return Session["user"] as User;

        var user = GetUser(); //however you normally get current user

        Session["user"] = user;

        return user;
    }
}

Чистый результат состоит в том, что для вас стало бы невозможным когда-либо запрашивать свойство User вашей сеансовой утилиты равным нулю.*

Редактировать : просто чтобы прояснить, сессия не имеет ничего общего с "запоминанием".Ваш сайт знает, что вы вошли в систему и прошли проверку подлинности, поскольку у вас есть файл cookie авторизации ASP.NET.Это не зависит от сессии.Сессия - это просто хранилище памяти, доступное каждому уникальному пользователю, аутентифицированное или нет .

...