29

Ich möchte meine Desktop-Java-Anwendung Single Sign-On für Active Directory-Benutzer haben. In zwei Schritten möchte ich:Wie Windows-Anmeldung für Single-Sign-On und Active Directory-Einträge für Desktop Java-Anwendung verwenden?

  1. Stellen Sie sicher, dass der bestimmte Benutzer mit einem Benutzereintrag in Windows angemeldet ist.
  2. überprüfen Sie einige Setup-Informationen für den Benutzer aus dem Active Directory aus

Mit Java: Programatic Way to Determine Current Windows User ich den Namen der aktuellen Windows-Benutzer erhalten kann, aber mich darauf verlassen? Ich denke, die

System.getProperty("user.name") 

wird nicht sicher genug sein? ("user.name" scheint von Umgebungsvariablen zu bekommen, so kann ich nicht darauf verlassen, denke ich?)

Frage Authenticating against Active Directory with Java on Linux bietet mir die Authentifizierung für den Vornamen + pass aber ich möchte authentifizieren basierend auf der Windows-Anmeldung?

Für den Active Directory-Zugriff wäre das LDAP wahrscheinlich die erste Wahl?

Ich bin mir nicht ganz sicher, ob ich die richtigen Fragen stelle, aber hoffentlich hat jemand einige Ideen, um mich weiter zu bringen.

Antwort

13

Es wird nicht unterstützt. Java 6 hat Verbesserungen, aber noch nicht genug.

Java hat einen eigenen GSS-Stack. Das Problem besteht in der einmaligen Anmeldung. Sie müssen das Kerberos-Ticket vom Betriebssystem beziehen (nicht vom Java-Stack). Andernfalls muss sich der Benutzer ein zweites Mal authentifizieren (wodurch der Zweck der einmaligen Anmeldung vereitelt wird).

Betrachten Sie http://java.sun.com/developer/technicalArticles/J2SE/security/. Suchen Sie nach "Access Native GSS-API" und es wird von einer neuen Systemeigenschaft sun.security.jgss.native gesprochen, die, wenn sie auf "True" gesetzt ist, Java dazu veranlasst, die zugrunde liegende Betriebssystem-GSS-Implementierung zu verwenden und Zugriff auf die Authentifizierung auf Betriebssystemebene zu gewähren. Perfekt! .... außer es wird nur für Solaris und Linux unterstützt, nicht für Microsoft Windows.

Java 6 scheint jedoch genug Unterstützung für die Funktion als Server Empfangen von SPNEGO-Authentifizierungsanforderungen von IE und dann Authentifizierung dieses Benutzers gegen Active Directory. Es ist nur die Desktop-Client-Unterstützung, die immer noch unvollständig ist.

+0

Bietet eine andere JVM Zugriff auf das Kerberos-Ticket wie beschrieben? –

+1

Es scheint, dass Java 8 diese Unterstützung hat. https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/jgss-features.html – Ramiro

0

Haben Sie darüber nachgedacht, mit der JNA api (Damit können Sie tun native Aufrufe an das Betriebssystem einfach)?

Sie können die win32 metod GetCurrentUser MSDN-Dokumentation unter http://msdn.microsoft.com/en-us/library/ms724432(VS.85).aspx aufrufen. Es befindet sich in Advapi32.dll.

Es hat auch eine Unicode-Version, GetCurrentUserW bei Bedarf.

Und Sie haben Recht. Es scheint, dass die Umgebungsvariable geändert werden kann, so dass die Verwendung irreführend sein kann.

Ich bin nicht sicher über plattformübergreifende Auswirkungen über 32/64bit Windows. Wenn Sie die Lösung in Code benötigen, ich bin sicher, dass ich etwas für sie schreiben könnte.

Aber ja, nur eine Idee :)

5

Verwenden JAAS mit einem LDAP LoginModule. Dadurch können Sie die zugrunde liegende Java-Sicherheitsinfrastruktur anschließen.

Wenn Sie die App offline schalten oder die App "debuggen" müssen, können Sie das LDAP-Modul einfach gegen ein Dummy-Modul austauschen. Dadurch können Sie Ihre "Sicherheit" weiter testen, ohne von Active Directory abhängig zu sein. Gut testbar, entkoppelt, und Sie können das Authentifizierungsschema zu einem späteren Zeitpunkt mit fast keinen Kummer.

+0

Danke, Unterstützt das Authentifizierung durch Windows-Login? (So ​​dass, wenn der Benutzer bei Windows angemeldet ist, muss er/sie Benutzername und Passwort für die Java-Anwendung nicht separat eingeben) Zuerst habe ich das nicht gefunden, musste immer noch suchen. – Touko

+0

Hmmm. Die einzigen Module, die ich gesehen habe, sind Teil eines größeren Frameworks wie WebLogic ... oder sind ein Design für den Java-Client, um Anmeldeinformationen an einen Webserver zu übergeben. Möglicherweise müssen Sie einen kleinen JAAS-Provider schreiben, der native Aufrufe verwendet, um dies zuverlässig zu tun. –

+2

Anstatt LDAP LoginModule zu verwenden, scheint das Krb5LoginModule den OS-Ticket-Cache zu verwenden (die Anmeldeinformationen wurden bei der Windows-Anmeldung erhalten), wenn es mit dem Parameter useTicketCache verwendet wird. Es scheint immer noch einige Probleme zu geben, aber das funktioniert jetzt auf .. – Touko

0

Sie werden wahrscheinlich die meiste Flexibilität erhalten, wenn Sie Spring Security verwenden. Sie können es sowohl mit JAAS- als auch mit LDAP-Authentifizierung verwenden.

2

Nur für das Wohl anderer diesen Thread zu lesen, hat http://www.javaactivedirectory.com/?page_id=196 ein Beispiel dafür, wie Single-Sign zu tun auf Windows/Active Directory

+0

Die gleiche Idee wie James Schek, aber hat klare Anweisungen, danke! Der eine große Nachteil bleibt noch, man muss mit Windows-Registrierung (allowtgtsessionkey Registry Key) streiten, die nicht in allen Fällen möglich ist (Probleme mit dem Setup + alle Leute mögen die Registrierung nicht geändert werden) – Touko

+3

leider Link ist kaputt und nicht leicht bestimmbar :-((-1) –

4

Projekt Waffle sowohl Client- als auch Server-Side-Code hat SSO auf Windows zu tun. Es ist JNA-basiert, keine nativen Bibliotheken erforderlich.

+0

Dies funktioniert nur für Windows Server und Client –