2011-05-09 29 views
5

¿Alguien sabe si un cliente Java 6 que se ejecuta en Windows puede autenticarse a través de NTLM al acceder a un servidor Microsoft que implementa el protocolo de autenticación SPNEGO?Autenticación HTTP "Negociar" a través de NTLM desde un cliente Java SE6 en Windows

Tengo entendido que Java 6 que se ejecuta en Windows tiene soporte integrado para SPNEGO, pero parece que la implementación de Java no intenta la autenticación NTLM en el caso de que la autenticación kerberos no sea posible. El Authenticator ejemplo proporcionado en los documentos de Sun falla con un error 401 no autorizado en respuesta al servidor que envía WWW-Authenticate: Negocie.

Aquí se presenta una descripción del entorno de prueba:

servidor de destino:

  • de Windows servidor independiente R2 2008 (no forma parte del dominio de AD)
  • servicio SOAP Microsoft implementa utilizando WCF
  • WCF está configurado para la autenticación SPNEGO (kerberos y NTLM)
  • El servidor WCF no puede ser reconfigurado gurada para apoyar a otros modos de autenticación :(

equipo cliente:

  • Windows 7 de 64 bits estación de trabajo independiente (no forma parte de un dominio)
  • cliente Java SE6 ejecutar el ejemplo Sun SPNEGO

El objetivo final es utilizar Apache CXF 2.4.0 para invocar servicios SOAP en el servidor WCF. Antes de agregar las complejidades de CXF y SOAP, he tratado de recuperar el WSDL del servidor utilizando una sencilla aplicación de prueba de Java para resolver los problemas de autenticación.

FWIW - Puedo acceder al servidor WCF desde IE utilizando el inicio de sesión del administrador local para el servidor Windows. También pude crear un cliente SOAP Delphi XE sin ninguna configuración de autorización especial. El cliente Delphi SOAP usa WinInet bajo el capó.

+0

¿Alguna vez resolvió su problema? –

+1

@David Brossard - Sí, conseguimos que las cosas funcionen. La advertencia de nuestra solución era que la funcionalidad auth Java nativa tenía problemas cuando se ejecutaba como un servicio de Windows a menos que se utilizara una cuenta de servicio. Más recientemente, comenzamos a utilizar el cliente HTTP de Apache, que tiene soporte de autenticación de NTLMv2. Le tomó un poco de delicadeza para que funcione, pero ha demostrado ser confiable en el uso de la producción pesada. –

+0

Gracias! Buscaré en el cliente Apache entonces. Mi gato se está ejecutando como el servicio de Windows, así que es bueno –

Respuesta

2

El SPNEGO de Java solo es capaz de Kerberos porque NTLM es una tecnología de legado heredada de MS. Si su máquina de destino no es parte de un dominio, como es en su caso, no tiene suerte. Deberías cambiar a autenticación DIGEST-MD5 si puedes.

+0

Gracias por su respuesta. Llegué a una conclusión similar: la implementación SPNEGO de Java no brinda soporte para NTLM. Dicho esto, Java admite nativamente NTLM/NTMLv2 con algunas pequeñas advertencias, al menos en la plataforma de Windows. Creo que hay problemas de licencia de MS para otras plataformas. Actualmente tengo un cliente CXF que ejecuta confiablemente NTLMv2 en producción contra Dynamics Nav 2009 R2 (un servidor basado en WCF).Preferiría digerir auth como sugieres, pero los desarrolladores de MS Nav solo implementaron soporte para SPENEGO y NTLMv2 :(El soporte NTLM solo se agregó en 2009 R2. –

+0

¿Escribiste mal? No hay soporte directo de Java para NTLM (v2) en Windows a menos que use bibliotecas de terceros. –

+1

No, lo que escribí es correcto: "La implementación de SPNEGO de Java no brinda soporte para NTLM." Java en Windows NO es compatible con la autenticación estándar NTLMv2, pero la implementación Java SPENGO solo es compatible con Kerberos. es que un cliente Java no puede autenticarse en un servidor web MS usando NTLM si el servidor está usando SPENGO (es decir, WWW-Authenticate: Negotiate) –

Cuestiones relacionadas