29

Mi piacerebbe avere la mia applicazione desktop Java con accesso SSO relativo agli utenti di Active Directory . In due passaggi, desidero:Come utilizzare l'accesso di Windows per l'accesso Single Sign-On e per le voci di Active Directory per l'applicazione Desktop Java?

  1. Assicurarsi che l'utente particolare abbia effettuato l'accesso a Windows con qualche voce utente.
  2. verificare alcune informazioni di configurazione per l'utente da Active Directory

Con Java: Programatic Way to Determine Current Windows User posso ottenere il nome dell'utente corrente di Windows, ma posso contare a questo? Penso che lo

System.getProperty("user.name") 

non sia abbastanza sicuro? ("user.name" sembra essere ottenuto da variabili di ambiente, quindi non posso fidarmi di quello, penso?)

Domanda Authenticating against Active Directory with Java on Linux mi fornisce l'autenticazione per nome + pass, ma vorrei autenticarmi basato sull'accesso a Windows?

Per l'accesso ad Active Directory, il LDAP sarebbe probabilmente la scelta?

Non sono del tutto sicuro se sto facendo le domande giuste, ma spero che qualcuno abbia qualche idea per inoltrarmi.

risposta

13

Non è supportato. Java 6 ha miglioramenti, ma non ancora abbastanza.

Java ha il proprio stack GSS. Il problema è per il single sign-on, è necessario ottenere il ticket Kerberos dal sistema operativo (non lo stack Java). In caso contrario, l'utente deve autenticarsi una seconda volta (annullando lo scopo del Single Sign-On).

Vedere http://java.sun.com/developer/technicalArticles/J2SE/security/. Cerca "Access Native GSS-API" e parla di una nuova proprietà di sistema sun.security.jgss.native che, se impostata su true, fa in modo che Java utilizzi l'implementazione GSS OS sottostante, dando accesso all'autenticazione a livello di sistema operativo. Perfetto! .... eccetto che è supportato solo per Solaris e Linux, non Microsoft Windows.

Java 6 tuttavia sembra avere un supporto sufficiente per agire come server ricevendo richieste di autenticazione SPNEGO da IE e quindi autentificando tale utente su Active Directory. È solo il supporto client desktop che è ancora incompleto.

+0

Qualche altra JVM fornisce accesso al ticket Kerberos come descritto? –

+1

Sembra che Java 8 abbia quel supporto, però. https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/jgss-features.html – Ramiro

0

Hai pensato di usare l'API JNA (consente di eseguire chiamate native al sistema operativo facile)?

È possibile chiamare il metodo win32 GetCurrentUser documentazione MSDN a http://msdn.microsoft.com/en-us/library/ms724432(VS.85).aspx. Si trova all'interno di Advapi32.dll.

Ha anche una versione unicode, GetCurrentUserW se necessario.

E hai ragione. Sembra che la variabile d'ambiente possa essere modificata, quindi può essere fuorviante da usare.

Non sono sicuro delle implicazioni cross-platform su finestre a 32/64 bit. Se hai bisogno della soluzione nel codice, sono sicuro che potrei scrivere qualcosa per questo.

Ma sì, solo un'idea :)

5

Usa JAAS con una LDAP LoginModule. Ciò ti consentirà di collegarti all'infrastruttura di sicurezza Java sottostante.

Quando è necessario portare l'app offline o "debugare" l'app, è possibile sostituire facilmente il modulo LDAP con un modulo fittizio. Ciò consente di continuare a testare la "sicurezza", senza dipendere da Active Directory. Altamente testabile, disaccoppiato, e lo schema di autenticazione è possibile in un secondo momento, senza alcun problema.

+0

Grazie, Supporta l'autenticazione tramite l'accesso di Windows? (In modo che quando l'utente è registrato su Windows, lui/lei non deve inserire nome utente e password per l'applicazione java separatamente) All'inizio non l'ho trovato, ho avuto modo di continuare a guardare ancora. – Touko

+0

Hmmm. Gli unici moduli che ho visto che fanno parte di un framework più grande come WebLogic ... o sono design per il client Java per passare le credenziali a un server web. Potrebbe essere necessario scrivere un piccolo provider JAAS utilizzando chiamate native per farlo in modo affidabile. –

+2

Invece di usare LDAP LoginModule, Krb5LoginModule sembra essere in grado di utilizzare la cache dei ticket del sistema operativo (le credenziali sono ottenute tramite l'accesso a Windows) quando viene utilizzato con il parametro useTicketCache. Sembrano esserci ancora alcuni problemi, ma questo funziona per ora. – Touko

0

Probabilmente avrai la massima flessibilità utilizzando Spring Security. Puoi usarlo sia con l'autenticazione JAAS che LDAP.

2

Solo per il bene degli altri la lettura di questa discussione, http://www.javaactivedirectory.com/?page_id=196 ha un esempio su come fare Single Sign-On con Windows/Active Directory

+0

Stessa idea di James Schek ma ha istruzioni chiare, grazie! L'unico svantaggio principale rimane, si deve seccarsi con il registro di Windows (chiave del Registro di sistema allowtgtsessionkey) che non è possibile in tutti i casi (problemi con l'installazione + tutte le persone non amano il registro che viene modificato) – Touko

+3

purtroppo il link è rotto e non facilmente Determinabile :-((-1) –

4

Progetto Waffle ha sia codice client e lato server per fare SSO su Windows. È basato su JNA, non sono necessarie librerie native.

+0

Funziona solo per Windows Server e Client –

Problemi correlati