12

Sto ancora provando a trovare una soluzione basata su Java per SSO (in esecuzione su * nix), che posso utilizzare su JBoss per autorizzarlo su un controller di dominio/Active Directory. Inizialmente ho provato a farlo tramite NTLM, ma ho rinunciato perché non sarà supportato su Windows Server> = 2008.SSO Java: autenticazione Kerberos contro Active Directory

Pertanto sto cercando di implementarlo utilizzando Kerberos, ma sembra impossibile trovare un corretto/funzionante soluzione. Si prega di punto me nella giusta direzione che spiega come impostare tale configurazione, come convalidare contro l'Active Directory e/o controller di dominio, al fine di:

  1. scoprire se l'account è valido e
  2. fetch la lista di gruppo dell'utente

Qualsiasi aiuto è apprezzato!


UPDATE

Sto lavorando a una soluzione che utilizza JCIFS-ext-0.9.4 e JCIFS-krb5-1.3.12. Ho creato la web.xml come descritto di seguito:

<web-app> 
    <!-- servlet/servlet-mapping/welcome-file-list skipped --> 

<filter> 
<filter-name>auth</filter-name> 
<filter-class>jcifs.http.AuthenticationFilter</filter-class> 

<init-param> 
<param-name>java.security.auth.login.config</param-name> 
<param-value>/WEB-INF/login.conf</param-value> 
</init-param> 

<init-param> 
<param-name>jcifs.spnego.servicePrincipal</param-name> 
<param-value>HTTP/[email protected]</param-value> 
</init-param> 

<init-param> 
<param-name>jcifs.spnego.servicePassword</param-name> 
<param-value>supersecret</param-value> 
</init-param> 

<init-param> 
<param-name>sun.security.krb5.debug</param-name> 
<param-value>true</param-value> 
</init-param> 

<init-param> 
<param-name>java.security.krb5.realm</param-name> 
<param-value>mydomain.com</param-value> 
</init-param> 

<init-param> 
<param-name>java.security.krb5.kdc</param-name> 
<param-value>testdom01.mydomain.com </param-value> 
</init-param> 

<init-param> 
<param-name>jcifs.smb.client.domain</param-name> 
<param-value>TESTDOMAIN</param-value> 
</init-param> 

<init-param> 
<param-name>jcifs.http.enableNegotiate</param-name> 
<param-value>true</param-value> 
</init-param> 

<init-param> 
<param-name>jcifs.http.basicRealm</param-name> 
<param-value>mydomain.com</param-value> 
</init-param> 

<init-param> 
<param-name>jcifs.http.domainController</param-name> 
<param-value>testdom01.mydomain.com</param-value> 
</init-param> 

</filter> 
<filter-mapping> 
<filter-name>auth</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 
</web-app> 

Questo porta alla seguente stacktrace se cercasse di accedere all'applicazione:

2010-07-22 15:53:10,588 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/google].[default]] Servlet.service() for servlet default threw exception 
java.lang.ArrayIndexOutOfBoundsException 
     at java.lang.System.arraycopy(Native Method) 
     at jcifs.ntlmssp.Type2Message.toByteArray(Type2Message.java:261) 
     at jcifs.spnego.Authentication.processNtlm(Authentication.java:265) 
     at jcifs.spnego.Authentication.process(Authentication.java:233) 
     at jcifs.http.Negotiate.authenticate(Negotiate.java:46) 
     at jcifs.http.AuthenticationFilter.doFilter(AuthenticationFilter.java:192) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) 
     at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) 
     at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175) 
     at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) 
     at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) 
     at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) 
     at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112) 
     at java.lang.Thread.run(Thread.java:619) 

Ogni aiuto è apprezzato.

risposta

5

Per fare ciò, è effettivamente necessario utilizzare LDAP. Fortunatamente per te, Java ha un solido supporto sia per Kerberos che per LDAP. La procedura dettagliata è http://java.sun.com/products/jndi/tutorial/ldap/security/gssapi.html.

Panoramica dei passaggi: - autenticazione di Kerberos - Utilizzare Kerberos per assumere l'identità dell'utente - Eseguire GSSAPI si legano ai server LDAP Active Directory - recuperare l'elenco di gruppo su LDAP

+0

Perché questo ha avuto un downvote? Kerberos non contiene un elenco di gruppi di utenti! – Borealid

0

Usiamo Jespa per gestire l'autenticazione NTLM, abbiamo testato su entrambi Tomcat & Glassfish in esecuzione su Solaris, IE & Firefox sono entrambi supportati e apprently Chrome ora supporta anche NTLM. Avrai bisogno di una licenza per uso commerciale, ma lo consiglierei sicuramente.

+0

problema con Jespa per me è che presuppone Java EE e l'utilizzo di framework come Play lo rende inutilizzabile per me – andyczerwonka

3

È possibile utilizzare Waffle. È gratuito e supporta Negotiate, NTLM e Kerberos. Puoi anche controllare l'elenco dei gruppi dell'utente con esso.

"WAFFLE - Windows Authentication Functional Framework (Light Edition) è una libreria nativa C# e Java che esegue tutto l'autenticazione di Windows (Negotiate, NTLM e Kerberos)."

+2

Waffle utilizza purtroppo Win32 API e funziona solo su Windows – MrG

0

Ho iniziato a scrivere un articolo mentre sperimentavo con kerberos e JBoss, il piano è di avere una guida completa per i principianti per l'installazione e l'uso di kerberos con JBoss. Non sto dicendo che è una risposta completa, ma se fai domande posso provare a rispondere e aggiungerli al blog.

the article

0

Se si desidera eseguire il debug i kerberos, configurazione di AD sulla vostra macchina quindi è possibile scaricare l'applicazione dal seguente link. https://github.com/shubham49/debugSSO Scaricare l'applicazione e distribuirla sul server weblogic. Dopo la distribuzione, apri la pagina iniziale e incontrerai diversi test per eseguire il debug della configurazione.