Существует 3 протокола аутентификации, которые можно использовать для выполнения аутентификации между Java и Active Directory в Linux или на любой другой платформе (и они не относятся только к службам HTTP):
Kerberos - Kerberos обеспечивает единый вход (SSO) и делегирование, но веб-серверам также требуется поддержка SPNEGO для принятия единого входа через IE.
NTLM - NTLM поддерживает SSO через IE (и другие браузеры, если они правильно настроены).
LDAP - привязка LDAP может использоваться для простой проверки имени учетной записи и пароля.
Существует также нечто, называемое «ADFS», которое обеспечивает единый вход для веб-сайтов, использующих SAML, который вызывает Windows SSP, поэтому на практике это в основном обходной путь использования одного из других вышеуказанных протоколов.
У каждого протокола есть свои преимущества, но, как правило, для максимальной совместимости вы обычно должны стараться «делать как Windows». Так что же делает Windows?
Во-первых, аутентификация между двумя компьютерами Windows предпочитает Kerberos, потому что серверам не нужно обмениваться данными с DC, и клиенты могут кэшировать билеты Kerberos, что снижает нагрузку на DC (и потому что Kerberos поддерживает делегирование).
Но если аутентифицирующие стороны не имеют обеих учетных записей домена или если клиент не может связаться с DC, NTLM требуется. Таким образом, Kerberos и NTLM не являются взаимоисключающими и NTLM не устарел в Kerberos. Фактически, в некоторых отношениях NTLM лучше, чем Kerberos. Обратите внимание, что при одновременном упоминании Kerberos и NTLM я должен также упомянуть SPENGO и встроенную аутентификацию Windows (IWA). IWA - это простой термин, который в основном означает Kerberos или NTLM или SPNEGO для согласования Kerberos или NTLM.
Использование привязки LDAP в качестве способа проверки учетных данных неэффективно и требует SSL. Но до недавнего времени внедрение Kerberos и NTLM было затруднительным, поэтому использование LDAP в качестве службы проверки подлинности не изменилось. Но на этом этапе этого, как правило, следует избегать. LDAP - это каталог информации, а не служба аутентификации. Используйте его по назначению.
Так как же реализовать Kerberos или NTLM в Java и, в частности, в контексте веб-приложений?
В ряде крупных компаний, таких как Quest Software и Centrify, есть решения, в которых конкретно упоминается Java. Я не могу комментировать их, поскольку они являются «решениями для управления идентификацией» в масштабах всей компании, поэтому, просматривая маркетинговый ход на их веб-сайте, трудно сказать, какие именно протоколы используются и как. Вам необходимо связаться с ними для уточнения деталей.
Реализация Kerberos в Java не очень сложна, поскольку стандартные библиотеки Java поддерживают Kerberos через классы org.ietf.gssapi. Однако до недавнего времени существовало серьезное препятствие - IE не отправляет необработанные токены Kerberos, он отправляет токены SPNEGO. Но с Java 6 SPNEGO был реализован. Теоретически вы должны быть в состоянии написать некоторый код GSSAPI, который может аутентифицировать клиентов IE. Но я не пробовал это. На протяжении многих лет реализация Sun Kerberos была комедией ошибок, поэтому, основываясь на послужном списке Sun в этой области, я не буду давать никаких обещаний относительно их реализации SPENGO, пока у вас не окажется эта птица.
Для NTLM существует проект Free OSS, называемый JCIFS, который имеет HTTP-фильтр проверки подлинности NTLM HTTP. Однако он использует метод «человек посередине» для проверки учетных данных на SMB-сервере, который не работает с NTLMv2 (который постепенно становится необходимой политикой безопасности домена). По этой и другим причинам часть HTTP Filter JCIFS планируется удалить. Обратите внимание на то, что есть несколько дополнительных источников, которые используют JCIFS для реализации той же техники. Поэтому, если вы видите другие проекты, которые утверждают, что поддерживают единый вход NTLM, проверьте мелкий шрифт.
Единственный правильный способ проверки учетных данных NTLM с Active Directory - это использование вызова NetrLogonSamLogon DCERPC через NETLOGON с безопасным каналом. Существует ли такая вещь в Java? Да. Вот оно:
http://www.ioplex.com/jespa.html
Jespa - это 100% -ная реализация Java NTLM, которая поддерживает NTLMv2, NTLMv1, параметры полной целостности и конфиденциальности и вышеупомянутую проверку учетных данных NETLOGON. И включает в себя HTTP SSO Filter, JAAS LoginModule, HTTP-клиент, SASL-клиент и сервер (с привязкой JNDI), универсальный «поставщик безопасности» для создания пользовательских служб NTLM и многое другое.
Mike