Роли пользователей - почему бы не сохранить сессию?

Я переношу приложение ASP.NET в MVC и должен хранить два элемента, относящихся к аутентифицированному пользователю: список ролей и список видимых идентификаторов элементов, чтобы определить, что пользователь может или не может видеть.

Мы использовали WSE с веб-службой в прошлом, и это сделало вещи невероятно сложными и невозможными для правильной отладки. Теперь мы бросаем веб-сервис, который я искал, чтобы резко упростить решение, просто чтобы сохранить эти вещи в сеансе. Коллега предложил использовать роли и поставщиков членства, но, глядя на это, я обнаружил ряд проблем:

a) Он страдает от аналогичных, но разных проблем для WSE в том, что он должен использоваться очень ограниченным способом, но это сложно сделать даже для написания тестов;

b) Единственная опция кэширования для RolesProvider основана на файлах cookie, которые мы отклонили по соображениям безопасности;

c) Он не вводит никаких осложнений и дополнительного нежелательного багажа;

Все, что мы хотим сделать, в двух словах, это хранить две строковые переменные в сеансе пользователя или что-то эквивалентное безопасным образом и ссылаться на них, когда нам нужно. То, что, похоже, составляет десять минут, до сих пор занималось несколькими днями расследования и усугубляло проблему, которую мы теперь обнаружили, что идентификаторы сеансов могут, по-видимому, подделываться, см.

http://blogs.sans.org/appsecstreetfighter/2009/06/14/session-attacks-and-aspnet-part-1/

Мне осталось думать, что нет простого способа сделать эту очень простую работу, но я считаю, что невозможно поверить.

Может ли кто-нибудь:

a) предоставить простую информацию о том, как сделать сеансы ASP.NET MVC безопасными, поскольку я всегда считал, что они были?

b) предложить другой простой способ сохранить эти две строковые переменные для зарегистрированных в ролях пользователя и т.д., не заменяя один сложный кошмар другим, как описано выше?

Спасибо.

Ответ 1

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

Я советую не вкладывать слишком много веры в статью, к которой вы привязались, но интересный отчет о урожайности 2002 года, связанный с вашей ссылкой. Вот мои путевки:

  • Не принимайте идентификаторы сеансов, встроенные в URL-адреса.

  • Сфокусируйте свое время на устранении угроз сценариев межсайтового сценария, то есть сканируйте все предоставленные пользователем данные и проанализируйте исполняемый файл java script.

  • Выдавать файлы cookie для полных доменов (например, myapp.mydomain.com)

  • Размещение вашего домена у оператора DNS высокого класса, например. тот, который разрешает только изменения DNS с предустановленного удаленного IP-адреса.

  • Не выставляйте файлы cookie с постоянным сеансом.

  • Переиздайте файл cookie сеанса, если кто-то прибыл на страницу входа с идентификатором сеанса, уже связанным с аутентифицированным сеансом.

  • Лучше все равно всегда выдавать новый cookie сеанса при успешной аутентификации и отказываться от предыдущего сеанса. (Может ли это быть настроено в IIS?)

Ответ 2

Единственный способ сделать безопасную cinnection - использовать SSL. Все, что меньше, и вам просто нужно сделать оценку, когда она "достаточно безопасна".

Переменная сеанса отлично работает для хранения значения, за исключением того, что веб-сервер может быть повторно использован и затем, что приведет к потере сеанса. Когда это произойдет, вам придется повторно аутентифицировать пользователя и снова установить переменную сеанса.

Сама переменная сеанса полностью безопасна в том смысле, что она никогда не покидает сервер, если вы специально не копируете его в ответ.

Ответ 3

Рассматривали ли вы настройку настраиваемого тега авторизации в MVC. Я привел пример этого в другом question.

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

Ответ 4

Вы пытаетесь контролировать доступ к функциям на уровне клиента? Это единственная причина, по которой я буду раскрывать роли и элементы для управления функциями на стороне клиента.

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

4Guys, похоже, показывает, как управлять функциями с ролями.

Ответ 5

Подходом, который я использовал в прошлом, является использование симметричного шифрования файла cookie наряду с SSL. Шифруйте информацию пользователя в ответе и расшифруйте его в запросе. Я не утверждаю, что это безопасно или на 100% безопасно, и я бы не хотел делать это в банковском приложении, но он достаточно хорош для многих целей.

Основная проблема с переменными сеанса заключается в том, что если вы храните их inProc, а не сохраняете их, тогда вам нужно применить "липкие" сеансы к балансировке нагрузки в среде веб-фермы. Guffa правильно, что без этой постоянной сессии переменные сессии будут иногда потеряны, что приведет к плохому опыту пользователя.

Важные сессии могут привести к неравномерному балансировке нагрузки, возможно, уменьшению значения возможности масштабирования.

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

Ответ 6

Мой очевидный вопрос: почему вы хотите сохранить роль пользователя в сеансе?

Вот мой ответ на ваш вопрос, как это помогает. Я приложил небольшое демо-приложение, чтобы вы могли взглянуть на мои вопросы и понять их. Когда вы открываете этот проект в визуальной студии, нажмите на вкладку проекта сверху и выберите конфигурацию asp.net. На странице, которая будет отображаться, вы можете создавать материалы для администрирования пользователей.

Вам нужно каким-то образом защитить роли пользователя? Ответ на этот вопрос заключается в том, что вам не нужно беспокоиться о сохранении роли для любого пользователя, когда у нас есть структура членства asp.net, профили и роли, чтобы помочь нам в этом. Все, что вам нужно сделать, это создать роль в базе данных aspnet и назначить эту роль пользователю.

Далее вы хотите сохранить две строки некорректно. Я предлагаю вам профиль пользователя для хранения пользовательской информации. Таким образом, у вас есть информация, доступная вам, когда вы захотите, из класса profilecommon.

Также см. прилагаемое демо-приложение, помещенное в конце моего блога http://blogs.bootcampedu.com/blog/post/Reply-to-httpstackoverflowcomquestions1672007user-roles-why-not-store-in-session.aspx

Ответ 7

Просто подскажите, вы можете использовать эту небольшую библиотеку:

http://www.codeproject.com/KB/aspnet/Univar.aspx

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