Authentifizieren mit Active Directory mit Java unter Linux
Habe ich eine einfache Aufgabe, die Authentifizierung gegen Active Directory mit Hilfe von Java. Nur die überprüfung von Anmeldeinformationen und sonst nichts. Sagen wir meine domain ist "Spaß.xyz.tld", OU Pfad unbekannt ist, und Benutzername/Passwort ist testu/testp.
Ich weiß, es gibt ein paar Java-Bibliotheken gibt, die diese Aufgabe vereinfachen, aber ich war nicht erfolgreich bei der Umsetzung. Die meisten Beispiele, die ich gefunden habe, angesprochen LDAP im Allgemeinen, nicht speziell Active Directory. Ausstellung LDAP-Anforderung bedeutet, dass das senden einer OU-Pfad, was ich nicht haben. Auch ist die Anwendung, die Probleme LDAP-Anfrage sollte bereits gebunden, um Active Directory zu, um darauf zugreifen zu können... Unsicher, da die Anmeldeinformationen gespeichert werden müssten irgendwo auffindbar. Ich würde gerne einen test binden mit test-Anmeldeinformationen, wenn möglich - das würde bedeuten, dass der account gültig ist.
Letzten, wenn möglich, ist es eine Möglichkeit zu solcher Authentifizierungsmechanismus verschlüsselt? Ich weiß, dass die AD-Kerberos verwendet, aber nicht sicher, ob Java-LDAP-Methoden tun.
Wer hat ein Beispiel für funktionierenden code? Danke.
InformationsquelleAutor der Frage DV. | 2008-12-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es 3 Authentifizierung Protokolle, die verwendet werden können, um die Authentifizierung zwischen Java und Active Directory auf Linux oder eine andere Plattform (und das sind nicht nur spezifisch für HTTP-Dienste):
Kerberos - Kerberos bietet Single-Sign-On (SSO) und delegation aber auch web-Server müssen auch die SPNEGO-Unterstützung zu akzeptieren SSO durch IE.
NTLM - NTLM-SSO unterstützt durch IE (und anderen Browsern, wenn Sie richtig konfiguriert sind).
LDAP - Eine LDAP-Bindung kann verwendet werden, um einfach überprüfen Sie einen Kontonamen und ein Passwort.
Es gibt auch etwas namens "ADFS", die SSO für websites mit SAML, dass Anrufe in die Windows-SSP-so in der Praxis ist es im Grunde ein Umweg über eine der anderen oben genannten Protokolle.
Jedes Protokoll hat seine Vorteile, aber als Faustregel gilt, für maximale Kompatibilität sollten Sie in der Regel versuchen, zu "tun, wie Windows funktioniert". Also was macht Windows?
Ersten, die Authentifizierung zwischen zwei Windows-Rechnern begünstigt, weil die Kerberos-Server müssen nicht für die Kommunikation mit den DC und die clients in den cache-Speicher von Kerberos-tickets verringert die Belastung auf den DCs (und weil die Kerberos-Delegierung unterstützt).
Aber wenn die Authentifizierung Parteien nicht beide über domain-accounts, oder wenn der client kommunizieren kann mit den DC -, NTLM erforderlich ist. Daher ist Kerberos und NTLM sind nicht gegenseitig exklusives-und NTLM ist nicht überholt von Kerberos. In der Tat, in gewisser Weise NTLM ist besser als Kerberos. Beachten Sie, dass bei der Nennung von Kerberos-und NTLM-im gleichen Atemzug muss ich auch erwähnen, SPENGO und Integrierte Windows-Authentifizierung (IWA). Die IWA ist ein einfacher Begriff, der im Grunde bedeutet, die Kerberos-oder NTLM und SPNEGO zu verhandeln, Kerberos oder NTLM.
Über eine LDAP-Bindung als eine Möglichkeit, Anmeldeinformationen zu überprüfen, ist nicht effizient und erfordert SSL. Aber bis vor kurzem Implementierung von Kerberos-und NTLM schwierig gewesen, so dass die Verwendung von LDAP als make-shift-Authentifizierung service beibehalten hat. Aber an diesem Punkt sollte es generell vermieden werden. LDAP ist ein Verzeichnis von Informationen und nicht einen Authentifizierungs-service. Verwenden Sie es für den beabsichtigten Zweck.
So, wie Sie implementiert die Kerberos-oder NTLM-in Java und in den Kontext von web-Anwendungen im besonderen?
Gibt es eine Reihe von großen Unternehmen wie Quest Software und Centrify, die Lösungen, die spezifisch auf Java. Ich kann nicht wirklich kommentieren diesen, wie Sie sind Unternehmens-weite "identity-management-Lösungen", so kann aus der marketing-spin auf Ihre website, es ist schwer zu sagen, genau welche Protokolle eingesetzt werden und wie. Sie benötigen würden, um Kontakt mit Ihnen für die details.
Implementierung von Kerberos in Java ist nicht besonders schwer, da die standard-Java-Bibliotheken-Unterstützung von Kerberos-durch die org.ietf.gssapi-Klassen. Jedoch, bis vor kurzem gab es eine große Hürde - also die nicht senden roh Kerberos-Token sendet es SPNEGO-Token. Aber mit Java 6, SPNEGO implementiert wurde. In der Theorie sollten Sie in der Lage zu schreiben, GSSAPI-code authentifizieren können, die IE-clients. Aber ich habe es nicht ausprobiert. Die Sun-Implementierung von Kerberos wurde eine Komödie von Fehlern, die im Laufe der Jahre, so dass basierend auf Sun ' s track record in diesem Bereich würde ich keine zusagen machen über Ihre SPENGO Implementierung, bis Sie haben, dass Vogel in der hand.
NTLM, es ist ein Freies OSS-Projekt namens JCIFS, hat eine NTLM HTTP authentication der Servlet-Filter. Aber es nutzt einen man-in-the-middle-Methode zum überprüfen der Anmeldeinformationen mit einem SMB-server, das funktioniert nicht mit NTLMv2 (die sich langsam zu einer gewünschten domain security policy). Aus diesem Grund, und andere, die HTTP-Filter-Teil JCIFS ist geplant entfernt werden. Beachten Sie, dass es gibt eine Reihe von spin-offs, die Verwendung JCIFS zu implementieren, die gleiche Technik. Also, wenn Sie sehen, andere Projekte, die Anspruch auf die Unterstützung der NTLM-SSO, überprüfen Sie das Kleingedruckte.
Der einzig richtige Weg, um zu überprüfen NTLM-Anmeldeinformationen in Active Directory ist mit der NetrLogonSamLogon DCERPC Anruf über NETLOGON mit Sicheren Kanal. Gibt es das noch in Java? Ja. Hier ist es:
http://www.ioplex.com/jespa.html
Jespa ist eine 100% Java-NTLM-Implementierung, die NTLMv2 unterstützt, NTLMv1, volle Integrität und Vertraulichkeit Optionen und die oben genannten NETLOGON-credential-überprüfung. Und es beinhaltet einen HTTP-SSO-Filter, eine JAAS-LoginModule, HTTP-client, SASL-client und-server (mit JNDI-binding), generische "security provider" für das erstellen von benutzerdefinierten NTLM-services und vieles mehr.
Mike
InformationsquelleAutor der Antwort user8134
Hier der code, den ich zusammen gestellt habe, basierend auf Beispiel aus diesem blog: LINK und diese Quelle: LINK.
InformationsquelleAutor der Antwort DV.
Ich habe gerade ein Projekt, das mit AD und Java.
Wir verwendeten Feder ldapTemplate.
AD ist LDAP-konform (fast), ich glaube nicht, dass Sie irgendwelche Probleme mit der Aufgabe, die Sie haben. Ich meine die Tatsache, dass es AD oder einem anderen LDAP-server ist es egal, wenn Sie wollen, zu verbinden.
Ich würde werfen Sie einen Blick auf: Spring LDAP
Haben Sie Beispiele zu.
Als für die Verschlüsselung verwendeten wir die SSL-Verbindung (so war es LDAPS). AD musste konfiguriert werden, auf eine SSL-port/Protokoll.
Aber zuerst von all, stellen Sie sicher, korrekte Verbindung zu Ihrem AD via LDAP-IDE. Ich benutze Apache Directory Studio, es ist wirklich cool, und es ist in Java geschrieben. Das ist alles, was ich brauchte. Für Testzwecke könnte man auch installieren Apache Directory Server
InformationsquelleAutor der Antwort Alexandru Luchian
Als ioplex und andere gesagt haben, gibt es viele Möglichkeiten. Eine authetifizierung unter Verwendung von LDAP (Novell LDAP-API), die ich verwendet habe etwas wie:
Als "special feature" erlaubt Active Directory LDAP-Bindungen gegen "user@domain", ohne mit dem distinguished name des Kontos. Dieser code verwendet StartTLS zu aktivieren die TLS-Verschlüsselung für die Verbindung; die andere alternative ist LDAP über SSL, das ist nicht unterstützt durch meine AD-Server.
Der eigentliche trick ist bei der Suche nach den server-und host; der offizielle Weg ist die Verwendung eines DNS-SRV (service) - Datensatz-lookup zu suchen, ein Bündel von Kandidaten-hosts, dann eine UDP-basierte LDAP - "ping" (in einer bestimmten Microsoft-format), um den korrekten server. Wenn Sie interessiert sind, ich habe geschrieben einige blog-Artikel über meine Reise, Abenteuer und Entdeckungen in diesem Bereich.
Wenn Sie wollen, um die Kerberos-basierte Benutzer/Passwort-Authentifizierung, die Sie suchen, in einem anderen Kessel der Fische, es ist machbar mit dem Java GSS-API-code, obwohl ich bin nicht sicher, es führt den letzten Schritt bei der überprüfung der Authentifizierung. (Der code tun, die Validierung, kann sich an den AD-server überprüfen Sie den Benutzernamen und das Passwort, die Ergebnisse in einem ticket-granting-ticket für den Benutzer, aber um sicherzustellen, dass der AD-server wird nicht imitiert, sondern dass es auch zu versuchen ein ticket zu bekommen, für die der Benutzer selbst, die ist etwas komplizierter.)
Wenn Sie wollen, um die Kerberos-basierten single sign-on (vorausgesetzt, dass Ihr Benutzer in der Domäne authentifiziert, die Sie tun können, dass auch mit dem Java GSS-API-code. Ich würde post ein code-Beispiel, aber ich muss immer noch meine hässlichen Prototyp in etwas Passform für das menschliche Auge. Check-out einige code von SpringSource für einige inspiration.
Wenn Sie auf der Suche für die NTLM - (ich wurde zu verstehen gegeben, ist weniger sicher) oder etwas anderes, gut, Glück.
InformationsquelleAutor der Antwort Tommy McGuire
Sind Sie nur der überprüfung Anmeldeinformationen? In diesem Fall könnte man nur tun plain
kerberos
und nicht die Mühe mitLDAP
.InformationsquelleAutor der Antwort Anthony
Wenn alles, was Sie tun möchten, ist die Authentifizierung gegen AD mit Kerberos -, dann eine einfache http://spnego.sourceforge.net/HelloKDC.java Programm sollte es tun.
Werfen Sie einen Blick auf das Projekt "pre-flight" - Dokumentation, die Vorträge über die HelloKDC.java Programm.
InformationsquelleAutor der Antwort Pat Gonzalez
http://java.sun.com/docs/books/tutorial/jndi/ldap/auth_mechs.html
SASL-Mechanismus unterstützt die Kerberos v4 und v5.
http://java.sun.com/docs/books/tutorial/jndi/ldap/sasl.html
InformationsquelleAutor der Antwort Mash See
ldap-Authentifizierung ohne SSL ist nicht sicher und kann jeder Benutzer einsehen der Anmeldeinformationen ldap client transfer usernamae und Kennwort bei der ldap bind-operation, So verwenden Sie Immer ldaps-Protokoll.
Quelle: Ldap-Authentifizierung Active directory in Java, Spring Security mit Beispiel
InformationsquelleAutor der Antwort Seema Kiran
Ich empfehle Ihnen, sich an die adbroker-Paket der oVirt Projekt. Es nutzt Spring-Ldap und die Krb5 JAAS-Login-Modul (mit GSSAPI), um die Authentifizierung mit Kerberos gegen Ldap-Server (Active Directory, ipa, rhds, Tivoli-DS). Suchen Sie den code auf der engine\backend\manager\Module\bll\src\main\java\org\ovirt\engine\core\bll\adbroker
Können Sie mithilfe von git zu Klonen Sie das repository, oder navigieren Sie mithilfe der gerrit link
InformationsquelleAutor der Antwort Yair Zaslavsky