NTLM дает сбой при использовании веб-службы SharePoint из Java? - PullRequest
2 голосов
/ 16 января 2012

У меня есть клиент Java, который использует стандартные веб-службы SharePoint 2010 (sitedata.asmx, permissions.asmx и т. Д.), Написанные с помощью реализации JAX-WS из JDK 6.

Пока аутентификация выполняется с NTLM с использованием пользовательской реализации Authenticator и подхода Authenticator.setDefault(...).

При работе в моей тестовой среде, в которой есть только один сервер SharePoint, он работает нормально. Я вижу все переговоры NTLM, используя WireShark.

Но, если он работает на клиенте с несколькими серверами, балансировкой нагрузки на оборудование и несколькими альтернативными сопоставлениями доступа SharePoint, я получаю ошибку 401 неавторизованной из вызовов веб-службы. У меня не было возможности использовать WireShark для отладки в этой среде.

Я запускаю свой клиент с компьютера с Windows (при настройке клиента), поэтому в соответствии с документацией Java это должно быть хорошо для NTLM. Кроме того, я использовал URL-адрес по умолчанию из SharePoint для доступа к веб-службам (не URL-адреса с балансировкой нагрузки).

Машина, на которой выполняется клиентское приложение, не является сервером SharePoint. На нем настроена встроенная проверка подлинности Windows с NTLM.

Кроме того, из-за политик администрирования SharePoint я не могу получить доступ к центральному администрированию SharePoint или внести какие-либо изменения в конфигурацию (или IIS).

Я хочу спросить, знает ли кто-нибудь, в чем может быть проблема? И, надеюсь, кто-нибудь знает, как это исправить?

Заранее спасибо.

EDIT:

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

Ответы [ 2 ]

3 голосов
/ 24 января 2012

Ну, наконец-то у меня появился шанс использовать WireShark в среде заказчиков.

Сначала я заметил, что у них настроен NTLM v2, но это нормально, поскольку Java 1.6 поддерживает его.

Затем яувидел, что, поскольку включена встроенная проверка подлинности Windows, текущие учетные данные зарегистрированного пользователя отправляются вместо настроенных в коде.Поскольку зарегистрированный пользователь не имеет разрешений на SharePoint, я получил 401 Unauthorized.

Согласно документации Java это нормальное поведение

На самом деле, если выработающий на компьютере с Windows как пользователь домена, или вы работаете на компьютере с Linux или Solaris, который уже выполнил команду kinit и получил кэш учетных данных.Класс MyAuthenticator будет полностью проигнорирован ....., который показывает, что имя пользователя и пароль не используются.Это так называемая единая регистрация.

Я надеюсь, что кто-то может ответить на этот вопрос , поскольку я думаю, что это именно то, что мне нужно.

Наконец,Я заметил, что при использовании HTTP сначала будут проверяться учетные данные Windows, и при сбое вместо них будут использоваться учетные данные, предоставленные кодом.Таким образом, все работает нормально.

При использовании HTTPS будут использоваться только учетные данные Windows, поэтому я всегда получаю 401 Unauthorized.

Не уверен, в чем причина различий между HTTP и HTTPS.

0 голосов
/ 21 марта 2014

Вы должны отключить прозрачную аутентификацию в Java.Вы можете сделать это, либо вставив пользовательский rt.jar, либо используя отражение для изменения классов Java.

tryTransparentNTLMServer и tryTransparentNTLMProxy - это поля в HttpURLConnection, которые необходимо установить доступными, а затем равными false при использовании метода отражения.Очевидно, просто измените этот класс, если вы делаете свой собственный rt.jar

...