Es gibt 3 Authentifizierungsprotokolle, die verwendet werden können Authentifizierung zwischen Java und Active Directory auf Linux oder einer anderen Plattform (und diese sind nicht auf HTTP-Dienste nur spezifisch) auszuführen:
Kerberos - Kerberos bietet Single Sign-On (SSO) und Delegation, aber Webserver benötigen auch SPNEGO-Unterstützung, um SSO über IE zu akzeptieren.
NTLM - NTLM unterstützt SSO über IE (und andere Browser, wenn sie ordnungsgemäß konfiguriert sind).
LDAP - Mit einer LDAP-Bindung können Sie einen Kontonamen und ein Kennwort einfach validieren.
Es auch als etwas, das „ADFS“, die SSO für Websites bietet SAML verwenden, die in der Windows-SSP ruft so in der Praxis ist es im Grunde eine Umwegen eine der anderen oben genannten Protokolle zu verwenden.
Jedes Protokoll hat seine Vorteile, aber als Faustregel sollte man im Allgemeinen versuchen, "so zu machen, wie Windows es tut". Was macht Windows?
Zunächst bevorzugt die Authentifizierung zwischen zwei Windows-Maschinen Kerberos, da Server nicht mit dem Domänencontroller kommunizieren müssen und Clients Kerberos-Tickets zwischenspeichern können, was die Belastung der Domänencontroller verringert (und weil Kerberos die Delegierung unterstützt).
Wenn jedoch die authentifizierenden Parteien nicht über Domänenkonten verfügen oder wenn der Client nicht mit dem Domänencontroller kommunizieren kann, ist NTLM erforderlich. Daher schließen sich Kerberos und NTLM nicht gegenseitig aus und NTLM wird nicht von Kerberos veraltet. Tatsächlich ist NTLM in mancher Hinsicht besser als Kerberos. Beachten Sie, dass wenn ich Kerberos und NTLM im selben Atemzug erwähne, auch SPENGO und Integrated Windows Authentication (IWA) erwähnen muss. IWA ist ein einfacher Begriff, der im Wesentlichen Kerberos oder NTLM oder SPNEGO zum Aushandeln von Kerberos oder NTLM bedeutet.
Die Verwendung einer LDAP-Bindung als Möglichkeit zur Validierung von Anmeldeinformationen ist nicht effizient und erfordert SSL. Aber bis vor kurzem die Implementierung von Kerberos und NTLM war schwierig, so dass die Verwendung von LDAP als Make-Shift-Authentifizierungsdienst beibehalten hat. Aber an dieser Stelle sollte es im Allgemeinen vermieden werden. LDAP ist ein Verzeichnis von Informationen und kein Authentifizierungsdienst. Verwenden Sie es für den beabsichtigten Zweck.
Wie also implementieren Sie Kerberos oder NTLM in Java und insbesondere im Kontext von Webanwendungen?
Es gibt eine Reihe großer Unternehmen wie Quest Software und Centrify, die Lösungen speziell für Java anbieten. Ich kann diese nicht wirklich kommentieren, da es sich um unternehmensweite "Identitätsmanagement-Lösungen" handelt. Aus dem Blick auf den Marketing-Spin auf ihrer Website ist es schwer zu sagen, welche Protokolle genau verwendet werden und wie. Sie müssen sie für die Details kontaktieren.
Die Implementierung von Kerberos in Java ist nicht besonders schwierig, da die Standard-Java-Bibliotheken Kerberos über die org.ietf.gssapi-Klassen unterstützen. Bis vor kurzem gab es jedoch eine große Hürde - IE sendet keine rohen Kerberos-Tokens, sondern sendet SPNEGO-Token. Aber mit Java 6 wurde SPNEGO implementiert. Theoretisch sollten Sie in der Lage sein, einen GSSAPI-Code zu schreiben, der IE-Clients authentifizieren kann. Aber ich habe es nicht versucht. Die Sun-Implementierung von Kerberos war im Laufe der Jahre eine Komödie von Fehlern. Aufgrund der Erfolgsbilanz von Sun in diesem Bereich würde ich keine Versprechen über die Implementierung von SPENGO abgeben, bis Sie diesen Vogel in der Hand haben.
Für NTLM gibt es ein freies OSS-Projekt namens JCIFS mit einem HTTP-Authentifizierungs-Servletfilter für NTLM. Es verwendet jedoch eine Man-in-the-Middle-Methode, um die Anmeldeinformationen mit einem SMB-Server zu überprüfen, der nicht mit NTLMv2 funktioniert (was langsam zu einer erforderlichen Domänensicherheitsrichtlinie wird). Aus diesem Grund und anderen wird der HTTP-Filter-Teil von JCIFS entfernt. Beachten Sie, dass es mehrere Spin-offs gibt, die JCIFS verwenden, um dieselbe Technik zu implementieren. Wenn Sie also andere Projekte sehen, die behaupten, NTLM SSO zu unterstützen, überprüfen Sie das Kleingedruckte.
Die einzige korrekte Möglichkeit, NTLM-Anmeldeinformationen mit Active Directory zu validieren, besteht darin, den NetrLogonSamLogon DCERPC-Aufruf über NETLOGON mit Secure Channel zu verwenden. Gibt es so etwas in Java? Ja.Hier ist sie:
http://www.ioplex.com/jespa.html
Jespa ist eine 100% Java-Implementierung, die NTLM unterstützt NTLMv2, NTLMv1, volle Integrität und Vertraulichkeit Optionen und die zuvor erwähnte NETLOGON Credential-Validierung. Dazu gehören ein HTTP-SSO-Filter, ein JAAS LoginModule, ein HTTP-Client, ein SASL-Client und -Server (mit JNDI-Bindung), ein generischer "Sicherheitsanbieter" zum Erstellen benutzerdefinierter NTLM-Dienste und mehr.
Mike
'import com.sun.jndi.ldap.LdapCtxFactory;' - Dies wird höchstwahrscheinlich nur mit einer Sun JVM funktionieren. –