Сайт MVC, самый безопасный способ сохранить учетные данные для входа - PullRequest
3 голосов
/ 23 августа 2011

Хорошо, у меня возникла дилемма, как сохранять учетные данные для входа в mvc одновременно, чтобы избежать как можно большего количества попаданий в базу данных.я знаю, что могу легко использовать Forms Authentication для сохранения экземпляра пользователя, но это целесообразно?

На данный момент я делаю это, сохраняя User Id в cookie, к которому я затем получу доступкаждый раз, когда вызывается действие, которое «требует» входа в систему.До получения доступа к действию идентификатор пользователя будет использоваться для извлечения «нового» экземпляра пользователя.Это будет одинаковым для каждого действия, я не сохраняю пользователя в куки, так как я чувствую, что после того, как куки скомпрометированы, все о пользователе должно быть доступно для хакера (идентификатор пользователя, адрес электронной почты, роли и т. Д.)

Так что, если у меня есть куча действий, которые потребуют входа в систему, что будет трудно из-за моей пропускной способности.Что вы думаете о методе, который я использую?Должен ли я изменить его, чтобы все объекты User сохранялись в cookie с коротким временем ожидания?Любые идеи с благодарностью.спасибо !!

Ответы [ 3 ]

3 голосов
/ 24 августа 2011

Похоже, вы пытаетесь решить проблему пропускной способности.Уже одно это говорит о том, что вы не должны хранить больше, чем нужно (т.е. идентификатор сессии) в куки.

Существуют две основные проблемы (среди прочих) для использования куки.1) Они отправляются при каждом запросе. 2) Вы можете хранить только ограниченный объем информации.

В общем, доверять всему, что пользователь дает вам (включая зашифрованные файлы cookie), плохо.

Сколько одновременных пользователей вы ожидаете иметь на своем сайте?Имейте в виду, что база данных сможет кэшировать определенные вызовы.Кроме того, если вы используете ORM, такой как nhibernate, вы получите там кэширование 2-го уровня.Если ничего не помогло, вы могли бы использовать управление сеансом в памяти?

Самая большая проблема, которую я имею при помещении идентификатора пользователя в cookie, - это энтропия этого ключа.Скажите, что ваш userId - это электронная почта.Все, что я должен сделать как злоумышленник, - угадать идентификатор пользователя, действительный в вашей системе, и я «автоматически» стану этим пользователем.Причина, по которой люди используют sessionID, а затем извлекают пользователя, состоит в том, что теоретически sessionID сложнее угадать.

Я бы предложил использовать управление сеансами базы данных, если вы находитесь в ситуации с балансировкой нагрузки.Если нет, используйте в памяти.Это быстро.Память дешевая.И если вы не сохраняете 10 МБ данных в сеансе для каждого пользователя и у вас есть 10000 пользователей, у вас все будет хорошо.

Как сказал Кен, вам, вероятно, следует использовать стандартные доступные теги [authorize]с MVC в отличие от создания собственного метода.

1 голос
/ 23 августа 2011

Похоже, вы в значительной степени реализовали аутентификацию на основе форм и что-то сравнимое с атрибутом [Authorize].

Так что, если у меня есть куча действий, которые потребуют входа в систему, что будет трудно из-за моей пропускной способности

Аутентификация с помощью форм использует куки и запекается в системе. Если вы не хотите хранить пользовательскую информацию в SQLServer, существует множество других опций.

Похоже, вы пытаетесь реализовать то, что уже сделано. На мой взгляд, давайте оставим материал по безопасности людям, которые знают о безопасности. Я бы предложил работать в предоставленных рамках, если у вас нет доказательства того, что вашему решению нужно что-то еще!

0 голосов
/ 24 августа 2011

В объекте FormsAuthenticationTicket имеется свойство UserData , которое можно использовать для хранения дополнительных данных, отличных от имени пользователя.

У меня был проект, в котором была похожая потребность. Я сохранил значения как NameValueCollection , закодированный как строка запроса:

 "email=myemail@some.com&roles=Somebody&roles=Special" 

(есть также удобный метод HttpUtility.ParseQueryString (), который полезен для возврата значений из свойства UserData)

Вы можете использовать FormsAuthentication.Encrypt и FormsAuthentication.Decrypt для преобразования билета в значение Cookie и из него.

...