Установите HttpContext.User для сеанса - PullRequest
7 голосов
/ 24 января 2010

Я реализовал пользовательскую аутентификацию в ASP.NET MVC. Если действительный пользователь пытается войти в систему, я устанавливаю HttpContext.User = user в методе входа в систему AccountController. Но он остается там только для этого запроса . Как я могу установить его для сеанса?

Я использовал альтернативу, установите HttpContext.Session["CurrentUser"] = user. Если я хочу узнать, авторизован ли сеанс, я должен проверить, что HttpContext.User != null. Но я не хочу раскрывать логику аутентификации везде в приложении. Если мне нужно это изменить, это будет грязно.

Пожалуйста, помогите мне решить эту проблему. Одним из решений может быть заполнение свойства HttpContext.User каждого запроса значением HttpContext.Session["CurrentUser"] в начале, но я не знаю, как это сделать.

Ответы [ 2 ]

11 голосов
/ 24 января 2010

Запишите следующий метод в классе приложения Global.asax

protected void Application_BeginRequest(Object sender, EventArgs e)
{
   HttpContext.Current.User = HttpContext.Session["CurrentUser"];
}

или вы можете использовать свойство «User» System.Web.Mvc.Controller, которое унаследовано вашим контроллерам (примечание: обязательно вызовите метод FormsAuthentication.SetAuthCookie при успешной проверке имени пользователя).

6 голосов
/ 24 января 2010

Лучший способ сделать это - написать собственный модуль аутентификации и подключить его к вашему приложению. Этот модуль будет выполняться перед любым запросом и будет иметь возможность установить свойство HttpContext.User соответствующим образом.

Например, рассмотрим модуль проверки подлинности с помощью форм. Перед запуском вашего обработчика HTTP (будь то страница ASPX, конвейер MVC и т. Д.) Он может перехватить запрос. Он считывает значение файла cookie входа в систему, расшифровывает и проверяет зашифрованное значение файла cookie и устанавливает HttpContext.User, если проверки пройдены. Таким образом, когда обработчик запускает и обрабатывает запрос, свойство User уже установлено правильно.

В конце концов, это будет выглядеть так, как будто вам не нужен настраиваемый атрибут авторизации в ASP.NET, поскольку атрибут [Authorize], уже предоставленный в поле, должен автоматически работать с вашим модулем аутентификации. Однако вашему методу AccountController.LogOn () (или тому, что вы используете вместо этого) нужно будет связаться с соответствующим поставщиком аутентификации, который генерирует токен, который будет проверен модулем аутентификации. Это должно быть единственное место, где вам нужно написать код, отличный от того, который предоставляется в коробке.

См. http://social.msdn.microsoft.com/Search/en-US?query=http%20modules и http://social.msdn.microsoft.com/Search/en-US?query=custom%20authentication%20asp.net для получения дополнительной информации.

...