2012-09-04 22 views
5

Desidero utilizzare WS .Net da IBM WebSphere.JAX-WS Client IBM che utilizza WS .Net con autenticazione Active Directory (NTLM)

Ho creato un client WS con un'implementazione JAX-WS IBM che utilizza WS .Net su IIS. Il client è su SUSE e l'autenticazione è NTLM con Active Directory di Windows Server 2003.

  • Se il client viene eseguito in linea di comando l'attuazione chiamate java.net.Authenticator per ottenere le credenziali e la richiesta è successo.

  • Se il client viene eseguito all'interno RAD l'Authenticator non viene chiamato e non riesce con 401.

  • Se il client viene eseguito all'interno di WebSphere l'Authenticator non viene chiamato e non riesce con 401.

  • Se creo una HttpConnection direttamente sull'URL WS ​​.Net, viene chiamato l'Autenticatore e la richiesta è riuscita.

  • Se invece dell'implementazione JAX-WS IBM utilizzo Axis2 (direttamente, non implementazione JAX-WS IBM Axis2), potrei passare al client Axis2 l'oggetto Authenticator e la richiesta è riuscita. Funziona solo per il protocollo NTLM con Windows Server 2003. Quando eseguiamo la migrazione a Windows Server 2008 il protocollo di autenticazione è NTLMv2 (tutti si spostano su NTLMv2 a causa di problemi di sicurezza con NTLM) e la richiesta non riesce perché NTLMv2 non è supportato dal client HTTP 3. X che è la dipendenza di Axis2. E per qualche tempo non migreranno.

Se uso altri Implementazione di JAX-WS di IBM perdo l'amministrazione console e la lettura automatica delle annotazioni, oltre a perdere il sostegno di IBM.

Domande

Io non capisco perché all'interno di RAD esso non ha funzionato, è lo stesso programma che funziona da linea di comando.

Come si fa a rendere l'implementazione IBM JAX-WS autenticata con il supporto del protocollo NTLMv2 con credenziali specifiche? (java.net.Authenticator fornisce questo e dovrebbe essere chiamato ... non lo è)

È il modo per rendere l'implementazione di IBM JAX-WS un altro client HTTP rispetto a quello standard?

Anche l'implementazione IBM JVM fornisce l'autenticazione NTLM (questo è il motivo per cui la riga di comando e le esecuzioni dirette di HttpConnection funzionano) quindi non capisco perché non lo usano per lo stack WS IBM.

Punti di forza

C'è un buon modo per fornire capacità bidirezionale di consumare WS con l'autenticazione ActiveDirectory?

commento

Primavera WS usa HttpClient 4.X che supporta NTLMv2 autenticazione, ma ho bisogno di un'implementazione di JAX-WS e dovrebbe essere quello di IBM. IBM JAX-WS sembra supportare solo l'AUTH di base. Non capisco come l'interoperabilità di Microsoft WS non sia importante per IBM.

Riferimenti

Authenticator conf:

http://docs.oracle.com/javase/6/docs/api/java/net/Authenticator.html#setDefault%28java.net.Authenticator%29

https://stackoverflow.com/a/5994706/14811

Grazie in anticipo!

risposta

2

Infine, questo è quello che ho fatto.

Creo gli oggetti JAXB con il plug-in RAD per creare un client JAX-WS. Uso i DTO generati come messaggi che passo alla libreria Spring WS. Spring WS 2.1 viene fornito con Http Client 4.2 che supporta NTLMv2.

ho creato una piccola biblioteca per rendere questo processo più facile, ma l'idea procedimento è:

  1. generare il client JAX-WS con RAD
  2. Creare una classe che implementa l'interfaccia del servizio generato da RAD
  3. per ogni metodo di interfaccia:
  4. 3.1 Iniettare parametri del metodo di interfaccia con l'oggetto JAXB
  5. 3.2 Passo questo oggetto al (oggetto Spring) WebServiceTemplate chiamata al servizio web.
  6. 3.3 Fusioni la risposta chiamata all'oggetto metodo di JAXB risposta
  7. 3.4 restituiscono il valore interno dell'oggetto risposta

Quindi, quello che finalmente si è riutilizzare la generazione di oggetti per un client JAX-WS per avvolgere i parametri del metodo di servizio nell'oggetto di cui Spring WS ha bisogno per effettuare la chiamata.

Per l'autenticazione NTLM impostata NTCredentials per il mittente WebServiceTemplate.

Axis2 1.7 avrà il supporto per NTLMv2 con versione aggiornata di HttpClient 4.2.X, ma non esiste ancora una data di rilascio.

See:

  • WebServiceTemplate WS chiamano

http://static.springsource.org/spring-ws/sites/2.0/apidocs/org/springframework/ws/client/core/WebServiceTemplate.html#marshalSendAndReceive%28java.lang.Object%29

  • WebServiceTemplate mittente

http://static.springsource.org/spring-ws/sites/2.0/apidocs/org/springframework/ws/client/support/WebServiceAccessor.html#getMessageSenders%28%29

  • NTCredentials

http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/auth/NTCredentials.html


Aggiornamento: ho provato Axis 1.7 e l'autenticazione NTLM funziona bene.

2

Si sta passando da NTLM (1994?) A NTLMv2 (1999) anziché a tecnologia basata su Kerberos (introdotto in Windows 2000) perché NTLMv2 è più sicuro ???

In termini di interoperabilità con Microsoft, i sistemi moderni utilizzerebbero Kerberos WS-Security tra il client JAX-WS e il servizio .NET. Questo è stato testato.

Quello che si sta tentando di fare (sostituire l'Authenticator utilizzato dal processo) è applicabile a un'applicazione Java autonoma, ma non si adatta al modello Java Enterprise in cui il processo Java ospita più "applicazioni" ciascuna con il proprio " requisiti di autenticazione, non importa se i requisiti interni imposti da WebSphere Server si interagiscono tra loro (App Server su App Server, Node Agent su App Server, App Server su LDAP, ecc.)

+1

Non scelgo di andare su NTLMv2, la società va a. WS-Security è uno strato sul protocollo di trasporto. NTLMv2 funziona nel livello di trasporto, quindi non posso andare con WS-Security. Kerberos è una scelta migliore su NTLMv2 ma non consente il bilanciamento del carico tramite DNS perché è resistente all'attacco Man-In-The-Middle. In questo caso l'IP di destinazione potrebbe cambiare. NTLMv2 è sicuro, non abbiamo bisogno di Kerberos. Ho testato alcuni stack WS (Axis2, IBM JAX-WS, Spring WS) con la strategia Authenticator e tutti loro lo evitano. Ma il documento Authenticator dice che qualsiasi accesso alla rete dovrebbe cercare le credenziali al suo interno. –

+0

Informazioni sull'autenticatore. Ho creato un piccolo programma che imposta un Authenticator e chiama un WS. Se eseguo questo programma all'interno di RAD, fallisce, se lo si esegue dalla riga di comando chiama Authenticator per ottenere le credenziali e funziona bene. Non so perché. –

Problemi correlati