Имя пользователя в заголовке HTTP для SSO
Я хочу добавить единый вход (SSO) в одно из моих веб-приложений. Я не хочу ничего тяжелого в данный момент, я просто хочу знать userId зарегистрированного пользователя, не требуя, чтобы они вводили имя пользователя.
Веб-приложение - это внутреннее приложение, поэтому я могу гарантировать, что он поступает с ПК с Windows и т.д.
Я посмотрел на jCIFS, но это, похоже, больше не поддерживается, и рекомендует коммерческий продукт.
Я также посмотрел WAFFLE, но я создаю SSO для приложения playframework, которое не использует стек Servlet, поэтому я не могу использовать SecurityFilter. Я попытался понять WindowsLoginModule, но не мог понять, что мне нужно было сделать для его реализации.
Можно ли просто получить имя пользователя из HTTP-заголовка или потребовать некоторого согласования прежде, чем оно опубликует заголовок?
Ответы
Ответ 1
Вы хотите, чтобы пользователь Windows автоматически входил в ваш веб-сайт intranet. Таким образом, учетные записи пользователей будут размещаться в активном каталоге, и обычным способом Microsoft будет использовать протокол, например NTML oder Kerberos. Обычно в приложениях рекомендуется использовать NTLM, хотя есть предприятия, которые все еще используют NTML (и jCIFS) для SSO.
Быстрый поиск на Kerberos и Java показал эту статью . Кажется, что это зависит от Java EE stack (JAAS).
Для более урезанного подхода: обычно вы не можете отправить имя пользователя в HTTP-запросе переносимым способом. С ActivX вы можете сделать:
var wshshell=new ActiveXObject("wscript.shell");
var username=wshshell.ExpandEnvironmentStrings("%username%");
На стороне сервера вы можете проанализировать заголовок http и извлечь имя пользователя с помощью выбранной вами технологии.
Ну, безопасность не имеет значения в вашем приложении playframework?
Почему вы не используете долгоживущие куки?
Надеюсь, что это поможет!
Ответ 2
В контексте интрасети с ActiveDirectory и рабочими станциями, зарегистрированными в домене, поддержка HTTP SPNEGO Negotiation
- лучший вариант. Но для этого требуются особые навыки в реализации ActiveDirectory и Java Kerberos.
Spring Безопасность обеспечивает реализацию и документацию, чтобы настроить его. Но Secure.Security
не предназначен для поддержки аутентификации на токенах, таких как HTTP Negotiation. Поэтому при использовании Spring для обеспечения безопасности потребуется специальный модуль интеграции.
Другие варианты OpenID и shibboleth, но для обоих требуется выделенный сервер, который может быть настроен для самого SPNEGO. Благодаря доступным модулям Play, интеграция в ваше приложение будет проще.
Единственный способ получить имя пользователя в HTTP-заголовке без сложных и небезопасных/ненадежных настроек на стороне клиента - использовать прокси-сервер проверки подлинности между браузерами и сервером приложений. Большинство этих прокси-серверов также поддерживают Kerberos SPNEGO как средство аутентификации.
Ответ 3
Не тяжелый ответ
Похоже, должно быть возможно, чтобы ваша команда ops реализовала групповую политику, которая отправит имя пользователя, зарегистрированное в журнале, в проводнике как HTTP-заголовок.
В противном случае вы правы в своем предположении, что между IE и вашим сервером существует какой-то "танец" переговоров. См. здесь. Возможно, вы можете подделать этот танец в своем коде Play.
Тяжелый ответ
Я знаю jCIFS и этот пример использует сервлеты и фильтры, но важные биты кода могут быть извлечены и пользовательский Play Authenticator может быть создан (я могу вставить пример Scala примера play.api.mvc.Security.Authenticated
, но ваш ответ отмечен Java). Вам нужны только заголовки запроса (не тело), поэтому он должен выполняться в аутентификаторе.
PS jCIFS, похоже, обновил с момента вашего сообщения, поэтому я предполагаю, что вы передумайте, взломав его. Я также опасаюсь невоспитанных библиотек, но иногда они достигают зрелости и стабильности, что облегчает необходимость в любых обновлениях.
Ответ 4
В Active Directory используется Kerberos, поэтому все зарегистрированные пользователи должны иметь билет в кеберосе.
Быстрый google нашел это:
Если вам нужны данные входа в Windows, я думаю, что это ваш единственный вариант.
Ответ 5
Вы можете использовать Shiro для включения единого входа в приложение.
Shiro id, независимо от сервлетов, и поскольку ваша фреймворк не поддерживает сервлеты, вы можете очень легко перейти на Сиро.
Вы можете создать Царство, в котором вы определяете hashPassword.
Вы можете настроить имя пользователя и hashPassword и попросить сиро аутентифицировать пользователя с помощью hashPassword.
Затем вы назначите роль для пользователя, который будет служить вашей цели SSO.
Вы можете аутентифицировать пользователя более чем для одного приложения, и, следовательно, когда пользователь входит в другое приложение, сиро уже аутентифицировал вас, и, следовательно, он сразу же запустит вас в приложение.
Вы можете пройти обширную документацию (исчерпывающе и вы сможете настроить ее при первом запуске) по следующей ссылке: -
http://shiro.apache.org/
Он предоставляет вам множество функциональных возможностей для проверки подлинности и авторизации, а также модулей безопасности и криптографии.
Ответ 6
Имя пользователя не отправляется в заголовке. Даже если на это не следует полагаться, поскольку опытный пользователь может подделывать ценности.
Ответ 7
Если NTLM будет действительным вариантом для вас Jespa, возможно, станет хорошей альтернативой JCIFS. Jespa (в отличие от JCIFS) поддерживает, помимо прочего, NTLM v2. Ограниченная версия (до 25 пользователей) бесплатна.
Ответ 8
Вы всегда можете получить любой заголовок из фильтра. См. Javadoc для HttpServletRequest.