Хранение имени пользователя / пароля во время обработки
Работая в контексте приложения ASP.NET, я создаю страницу, которая сможет выполнять сценарии базы данных для одной из многих баз данных в нашей среде. Для этого нам нужно запросить у пользователя комбинацию имени пользователя и пароля, это значение можно использовать для всех серверов без проблем.
Вопрос в том, где находится наиболее безопасное место для хранения этой информации? Мы должны хранить его временно, так как когда они находятся на этой конкретной странице, они могут выполнять сотни сценариев через несколько обратных передач. Из того, что я могу сказать, у меня есть 3 варианта, и я не уверен, что является лучшим. Ниже я расскажу об опциях, какова рекомендация всех здесь? Что является наиболее безопасным, но при этом дружественным к пользователю?
Хранить информацию в Viewstate
Одной из первых идей, которые мы обсуждали, было сохранение информации после ее предоставления пользователем в ViewState для страницы. Это полезно, поскольку информация будет существовать только на протяжении всего срока действия страницы, однако мы не уверены в последствиях для безопасности.
Хранить информацию в сеансе
Следующая идея, которая у нас была, заключалась в том, чтобы сохранить ее в сеансе, однако недостатком этого является то, что информация может быть доступна для других страниц внутри приложения, и эта информация всегда остается в памяти на сервере.
Хранить информацию в приложении
Последняя идея, которая у нас была, заключалась в том, чтобы сохранить ее в кеше приложения с пользовательским ключом и скользящим 5-минутным сроком действия. Это по-прежнему будет доступно для других страниц, однако это обеспечит кэширование информации на более короткий период.
Зачем?
Последний важный вопрос: "Зачем ты это делаешь?". Почему бы нам просто не использовать их идентификаторы Lan? Ну, мы не можем использовать идентификаторы локальной сети из-за отсутствия сетевой поддержки для делегирования.
S0 какое рекомендуемое решение? Зачем? Насколько это безопасно и можем ли мы быть?
Обновить
Отличная информация была обсуждена. Чтобы уточнить, мы работаем в среде интрасети, мы не можем использовать олицетворение или делегирование из-за ограничений в сети.
7 ответов
На мой взгляд, естественным местом для этого является сессия.
Я не уверен, почему вы, похоже, боитесь "других страниц внутри приложения" (вы управляете приложением, не так ли?), Но если вы действительно это делаете, вы можете использовать какое-то шифрование, прежде чем сохранить его.
Но если вы собираетесь это сделать, данные могут также находиться во ViewState.
Мне не нравятся какие-либо из этих идей, но я полностью ненавижу идею viewstate.
Я не знаю, к какому количеству баз данных вы подключаетесь, но если их количество ограничено, мне интересно, обрабатывать ли ваши аутентификацию и авторизацию стандартным безопасным способом, а затем подключаться к этим базам данных через интегрированную защиту, используя олицетворение личности с помощью учетная запись, которая имеет минимальные разрешения.
ViewState
подход хорош, но есть проблема в том, что вы даете клиенту имя пользователя и пароль. Даже если вы зашифруете его, если у какого-то злоумышленника есть ключ шифрования, ситуация будет не очень хорошей.
Учитывая Session
а также Application
подходы, я не думаю, Application
подход имеет смысл. Данные зависят от пользователя, поэтому Session
должен быть путь. Он исчезнет, как только сессия пользователя будет закрыта. Кстати, если вы решили хранить его на сервере, используйте SecureString
учебный класс.
Как писал Джон Макинтайр, для этого вы должны использовать интегрированную защиту и олицетворение.
Если по какой-либо причине вы не можете использовать его и собираетесь предоставить собственную страницу входа в систему, обязательно используйте SSL для шифрования трафика между браузером и вашим сервером. Использование подхода ViewState также совершенно небезопасно, если вы не используете SSL, есть инструменты для очень удобного просмотра содержимого. Из перечисленных вами методов наилучшим будет использование состояния сеанса. Вы можете разгрузить, сохраняя состояние сеанса из памяти вашего веб-сервера и сохраняя эти данные в базе данных, которую вы можете защитить так, как вы хотите. Если вам не нравится, как они работают, вы даже можете написать своего собственного провайдера состояния сеанса и применить необходимую безопасность.
Никогда не храните пароли!
Скорее храните хэш пароля. Смотрите: http://en.wikipedia.org/wiki/Crypt_(Unix).
Я знаю, что это не отвечает на этот вопрос, но чем больше программистов игнорируют этот совет, тем легче преступникам будет воровать данные. Не позволяйте вашей организации стать новостью.
Хранение в Viewstate увеличивает вашу подверженность, потому что пароль будет летать по Интернету снова и снова. Это зависит от вас, если шифрование достаточно хорошо для устранения этого риска.
Использование приложения или сеанса хранит пароль на сервере. Как уже упоминалось выше, SecureString не позволит людям просто читать пароли из памяти. Сеанс будет масштабироваться для большего количества пользователей, и, возможно, что более важно, для нескольких серверов, намного проще, чем для Application. Если вы не уверены, что никогда не будете использовать более 1 веб-сервера, я не буду использовать приложение, так как вам придется синхронизировать все серверы.
Имя пользователя / пароль действительно не должны храниться где-либо.
Вы храните соединение с активной базой данных, предпочтительно из пула в вашем объекте Session. Вам нужно только имя пользователя / пароль столько, сколько требуется для входа в базу данных.
Хотя другая страница может использовать прямое соединение, она не дает кому-либо еще постоянный доступ к базе данных, как если бы вы сохранили имя пользователя / пароль.