2012-09-04 30 views
5

Quiero consumir .Net WS de IBM WebSphere.JAX-WS Cliente de IBM que consume .Net WS con autenticación de Active Directory (NTLM)

Creé un WS-client con JAX-WS Implementación de IBM que consume un .Net WS en IIS. El cliente está en SUSE y la autenticación es por NTLM con Windows Server 2003 Active Directory.

  • Si el cliente se ejecuta en la línea de comandos de la aplicación llama java.net.Authenticator para obtener las credenciales y la solicitud es exitosa.

  • Si el cliente se ejecuta dentro de la RAD Authenticator no se llama y falla con 401.

  • Si el cliente se ejecuta en el interior de WebSphere el Authenticator no es llamado y falla con 401.

  • Si creo una HttpConnection directamente a .Net WS URL, se llama al Authenticator y la solicitud es exitosa.

  • Si en lugar de la implementación de JAX-WS IBM utilizo el Axis2 (directamente, no la implementación IBM Axis2 JAX-WS) podría pasar al cliente Axis2 el objeto Authenticator y la solicitud es exitosa. Esto solo funciona para el protocolo NTLM con Windows Server 2003. Cuando migramos a Windows Server 2008, el protocolo de autenticación es NTLMv2 (todos se mueven a NTLMv2 debido a problemas de seguridad con NTLM) y la solicitud falla porque NTLMv2 no es compatible con HTTP Client 3. X esa es la dependencia de Axis2. Y durante un tiempo no van a migrar.

Si utilizo otra Implementación de JAX-WS de IBM me suelta la administración de la consola y la lectura automática de anotación, más que perder el apoyo de IBM.

Preguntas

que por qué no se deje en el interior de RAD que Dejase't trabajo, es el mismo programa que funciona desde la línea de comandos.

¿Cómo se puede autenticar la implementación de JAX-WS IBM con el soporte de protocolo NTLMv2 con credenciales específicas? (java.net.Authenticator le proporciona esto, y debe llamarse ... no)

¿Hay alguna manera de hacer que la implementación de IBM JAX-WS use otro cliente HTTP que el estándar?

Incluso la implementación de IBM JVM proporciona autenticación NTLM (esta es la razón por la cual funciona la línea de comandos y las ejecuciones directas de HttpConnection), así que no entiendo por qué no la usan para la pila IBM WS.

puntos Plus

¿Hay alguna buena manera de proporcionar la capacidad bidireccional de consumir WS con la autenticación de ActiveDirectory?

comentario

primavera WS utiliza HttpClient 4.X que soporta autenticación NTLMv2, pero necesito una aplicación JAX-WS y debe ser el que IBM. IBM JAX-WS solo parece ser compatible con AUTH básico. No entiendo cómo la interoperabilidad WS de Microsoft no es importante para IBM.

Referencias

autenticador conf:

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

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

Gracias de antemano!

Respuesta

2

Finalmente, Esto es lo que hice.

Creo los objetos JAXB con el complemento RAD para crear un cliente JAX-WS. Yo uso los DTO generados como los mensajes que paso a la biblioteca de Spring WS. Spring WS 2.1 viene con Http Client 4.2 que brinda compatibilidad con NTLMv2.

He creado una pequeña biblioteca para que este proceso sea más fácil, pero la idea procedimiento es:

  1. Generar el cliente JAX-WS con RAD
  2. Crear una clase que implementa la interfaz de servicio generada por RAD
  3. para cada método de interfaz:
  4. 3,1 Inyectar los parámetros del método de interfaz al objeto JAXB
  5. 3,2 Pass este objeto a la (objeto de primavera) WebServiceTemplate llamada de servicio web
  6. 3.3 moldeada la respuesta de llamada al objeto JAXB respuesta método
  7. 3.4 Retorno del valor interno del objeto respuesta

Por lo tanto, lo que finalmente se hace es volver a utilizar la generación de objetos para un cliente JAX-WS para ajuste los parámetros del método de servicio en el objeto que Spring WS necesita para realizar la llamada.

Para autenticación NTLM, establezca NTCredentials en el remitente WebServiceTemplate.

Axis2 1.7 tendrá soporte para NTLMv2 con la versión actualizada de HttpClient 4.2.X, pero todavía no hay una fecha de lanzamiento.

Ver:

  • WebServiceTemplate WS llaman

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

  • WebServiceTemplate emisor

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


actualización: Probé Eje 1.7 y la autenticación NTLM funciona bien.

2

¿Se está moviendo de NTLM (1994?) A NTLMv2 (1999) en lugar de tecnología basada en Kerberos (introducido en Windows 2000) porque NTLMv2 es más seguro ???

En términos de interoperabilidad con Microsoft, los sistemas modernos utilizarían WS-Security Kerberos entre el cliente JAX-WS y el servicio .NET. Esto ha sido probado.

Lo que está intentando hacer (reemplazar el Authenticator utilizado por el proceso) es aplicable a una aplicación Java independiente, pero no encaja en el modelo Java Enterprise donde el proceso Java aloja múltiples "aplicaciones" cada una con la suya propia " "requisitos de autenticación, no importa los requisitos internos impuestos por los procesos del servidor WebSphere que se comunican entre sí (servidor de aplicaciones a servidor de aplicaciones, agente de nodo a servidor de aplicaciones, servidor de aplicaciones a LDAP, etc. .....)

+1

No elijo ir a NTLMv2, la empresa va a. WS-Security es una capa sobre el protocolo de transporte. NTLMv2 funciona en la capa de transporte, por lo que no puedo ir con WS-Security. Kerberos es una mejor opción que NTLMv2, pero no permite el equilibrio de carga a través de DNS porque es resistente al ataque Man-In-The-Middle. En este caso, el IP objetivo podría cambiar. NTLMv2 es seguro, no necesitamos Kerberos. Probé algunas pilas WS (Axis2, IBM JAX-WS, Spring WS) con la estrategia Authenticator y todas ellas lo evitan. Pero el documento Authenticator dice que cualquier acceso de red debería buscar credenciales en él. –

+0

Acerca del autenticador. Creé un pequeño programa que establece un Authenticator y llama a WS. Si ejecuto este programa dentro de RAD, falla, si lo ejecuta desde la línea de comandos llama al Authenticator para obtener las credenciales y funciona bien. No sé por qué. –

Cuestiones relacionadas