2013-03-20 1 views
1

я вопрос, касающийся обработки входа пользователя при переносе приложения на MVC:ASP MVC против WebForms: с помощью SessionState для входа пользователя

  • в «старых» WebForm дней, разработчики просто использовали Объект SessionState, чтобы установить пользователя для входа в систему, например, просто помещая пользовательский объект в SessionState (и этот пользовательский объект содержит простые свойства, такие как name/lastlogon/etc.)

  • этот материал очень хорошо работал для нас , и я видел множество приложений, которые делают это таким образом

  • да, я знаю, что это MembershipProvide-штучка, но я никогда не использовал его

Теперь, в MVC, все говорят мне, что «с помощью SessionStat для это плохо» и «приложения построены, что путь несовершенны в дизайне »и что« существует множество угроз безопасности »и т. д.

Я использовал этот метод, потому что он работал для приложения очень надежно, он был прост в реализации и охватывал все, что нам нужно.

(Конечно, есть вещь с процессом веб-рециркуляция рабочего и опорожнение сеанс - но это еще не проблема, в нашем случае, так как приложение работает для каждой страны на выделенной машине)

Я прочитал учебники, рассказывающие мне, чтобы они помещали этот материал в БД и -встречу - выполняли запрос в БД, чтобы проверить, зарегистрирован ли пользователь, за EACH запрос? Но: ни при каких обстоятельствах это не выполнимо, так как я хочу, чтобы запросы БД были минимальными.

Так что мой вопрос:

A), что не так с использованием так и в новом приложении MVC?

B) Каков наилучший способ справиться с этим сценарием в недавно созданном приложении MVC?

Что касается идеи session-in-DB: вместо этого я установил бы дополнительную службу, например «диспетчер сеансов», который получает запрос по сети, но такие простые запросы не должны БД - это не хорошая идея?

Любая идея, подсказка/etc. высоко ценится, так как этот сценарий действительно смущает меня: -X

+1

Используйте [Членство] (http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx) и Forms/Windows Authentication в любых веб-формах или приложении MVC. Это официальный MS рекомендованный способ обработки пользователей и аутентификации. – jrummell

+0

Пользователь получит дополнительный файл cookie, не так ли? Во-вторых: Где и как он хранит материал, а также что он делает, если мне нужно, чтобы пользовательский объект мог переносить больше объектов в будущем? – johngrinder

+0

Что касается членства-провайдера «полезность»: в этом SO-потоке http://stackoverflow.com/questions/440568/why-should-i-use-asp-net-membership-security-model/ один из самих MS-разработчиков сказал, что «мало пользы от включенного контроля»? – johngrinder

ответ

2

A)

Фундаментальной в ASP.NET MVC Framework является то, что его без гражданства. Данные передаются с использованием HTTP-запросов и отправляются в представления в моделях viewmodels. Веб-формы пытались сохранить состояние с помощью viewstate и т. Д., Поэтому вы бы увидели зарегистрированного пользователя в сеансе. То, что не сказать, сессия не должна использоваться полностью в asp.net mvc, есть некоторые обстоятельства, когда это может быть полезно. Как и сохранение трехэтапного процесса формы, который должен сохраняться на последнем шаге. Но в целом у нас уже есть рекомендуемый способ для обработки логинов, и то forms authentication

B)

Для доступа к объекту пользователя, вы можете создать custom identity реализующий интерфейс IPrincipal и добавить необходимые пользовательские поля тебе нужно.Затем установите индивидуальный идентификатор в global filter и получите доступ к нему в результатах вашего действия. Что касается нежелания запрашивать базу данных для каждого запроса, почему бы вам просто не вызвать ее для первоначального запроса, тогда кешируйте результат до тех пор, пока пользователь не будет обновлен, когда вы затем сможете перезагрузить объект и снова установить его в пользовательском удостоверении.

+0

To ** A) ** Пользователь должен быть идентифицирован на сеансе входа в систему - если нет, вы не можете заниматься поиском в Facebook или на Amazon; они должны «идентифицировать» пользователя по каждому запросу, им нужно знать, к какому из своих сеансов сервера принадлежит текущий запрос, - тогда их дизайн также является ошибочным, если вы вызываете аргумент без состояния? To ** B) ** все это удостоверение личности/основной материал - как он хранит, к какому пользователю/учетной записи принадлежит запрос? Даже эта система должна хранить вещи * в любом месте * в процессе работы с серверами/рабочими - или я что-то пропущу? Как он обрабатывает вопрос «пользователь зарегистрировался?» – johngrinder

+0

Действительно, в настоящее время я думаю, что я вообще ничего не понимаю, в то время как приложение уже живет в двух странах. :-(что-то действительно меня смущает - может быть, это не проблема внедрения, а еще более программно-философский вопрос ... – johngrinder

+0

Чтобы идентифицировать пользователя во входном сеансе, вы можете установить cookie с помощью FormsAuthentication.SetAuthCookie, это войдет в систему пользователь, заполняющий свойство User.Identity.Name (имя пользователя пользователя) после перенаправления. Затем вы можете использовать это значение внутри cookie для запроса своего db между запросами и заполнения пользовательского идентификатора (с дополнительной информацией пользователя, которая вам нужна). – gdp