2013-08-05 6 views
1

Вместо использования системы ASP.NET MVC пользователя, я просто с помощью сеанса, как следующее:ASP.NET MVC 4 и сеанс безопасности просачиваться

Когда он входит в систему (логин + пароль), я Позовите соответствующий пользователю из базы данных и набор:

Session["UserId"] = fetchedUser.UserId; 

Тогда, я всегда проверять, если он вошел в систему:

if (Session["UserId"] != null && ...) 

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

Chrome's inspector

Мои вопросы:

  1. Почему сеансы безопаснее, чем куки, если идентификатор сеанса сохраняется в куки?
  2. Могу ли я сделать это более безопасным (и продолжить использование сеанса)?
  3. Как внутренняя система авторизации пользователя ASP.NET?
+0

Безопасность - это не то, что вы хотите сделать сами, если вы не учитесь. Вы уверены, что не должны использовать встроенную систему безопасности? –

ответ

6

Основной причиной отказа от использования сеанса в качестве механизма аутентификации является то, что он может сделать ваше приложение уязвимым для Session Fixation. Например, проблема может заключаться в том, что пользователь прибыл на ваш сайт с использованием протокола HTTP и получил идентификатор сеанса, который хранится в файле cookie ASP.NET_SessionId. Пользователь может позже войти в систему, и хотя ваши страницы входа могут быть защищены под HTTPS, токен сеанса уже был сгенерирован под HTTP, что означает, что он уже был отправлен с использованием cleartext.

Чтобы ответить на другие вопросы:

Почему сеансы безопаснее, чем куки, если идентификатор сеанса сохраняется в печенье?

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

Могу ли я сделать это более безопасным (и продолжить использование сеанса)? Как внутренне ASP.NET Пользовательская система авторизации?

Встроенный провайдер уже подходит по назначению, поэтому было бы желательно использовать его, а не выдумывать другой механизм для удовлетворения ваших требований. Он также легко расширяется, поэтому вы можете настроить его в соответствии с вашими потребностями. Аутентификация пользователя ASP.NET создает зашифрованный билет и сохраняет его в файле cookie, а не хранит ссылку на переменную на стороне сервера: http://support.microsoft.com/kb/910443

Я также хотел бы обратить ваше внимание на механизм вывески и как его защитить.В частности,

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

Подробности здесь: http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.signout.aspx

Кроме того, вы можете установить "secure" flag на вашем ASP auth cookie, чтобы предотвратить его утечку через HTTP с помощью MITM злоумышленника.

Смежные вопросы