Имя пользователя в заголовке 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.