¿NTLM falla al consumir el servicio web de SharePoint desde Java?
web-services sharepoint-2010 (2)
Bueno, finalmente tuve la oportunidad de usar WireShark en el entorno del cliente.
Primero noté que tienen configurado NTLM v2, pero eso está bien, ya que Java 1.6 lo admite.
Luego vi que, dado que la Autenticación integrada de Windows está habilitada, se envían las credenciales actuales del usuario registrado en lugar de las configuradas en el código. Como el usuario registrado no tiene permisos en SharePoint, recibí 401 no autorizado.
Según la documentación de Java, este es el comportamiento normal
De hecho, si está ejecutando en una máquina con Windows como un usuario de dominio, o, se está ejecutando en una máquina Linux o Solaris que ya ha emitido el comando kinit y obtuvo la caché de credenciales. La clase MyAuthenticator será completamente ignorada ... lo que muestra que el nombre de usuario y la contraseña no son consultados. Este es el llamado Single Sign-On.
Espero que alguien pueda responder esta pregunta, ya que creo que eso es exactamente lo que necesito.
Finalmente, observé que con HTTP primero se probarán las credenciales de Windows y, en caso de error, se usarán las credenciales proporcionadas por el código. Por lo tanto, todo funciona bien.
Al usar HTTPS, solo se usarán las credenciales de Windows, por lo que siempre obtuve 401 no autorizado.
No estoy seguro de qué causa la diferencia entre HTTP y HTTPS.
Tengo un cliente Java que consume los servicios web estándar de SharePoint 2010 (sitedata.asmx, permissions.asmx, etc.) escritos con la implementación de JAX-WS del JDK 6.
Hasta ahora, la autenticación se realiza con NTLM utilizando una implementación personalizada de Authenticator
y el enfoque Authenticator.setDefault(...)
.
Cuando se ejecuta en mi entorno de prueba que tiene solo un servidor de SharePoint, funciona bien. Puedo ver toda la negociación de NTLM usando WireShark.
Pero, si se ejecuta en un cliente que tiene varios servidores, equilibrio de carga de hardware y múltiples asignaciones de acceso alternativas de SharePoint, recibo el error 401 no autorizado de las llamadas al servicio web. No he tenido la oportunidad de utilizar WireShark para depurar en ese entorno.
Ejecuto mi cliente desde una máquina con Windows (en la configuración del cliente), así que de acuerdo con la documentación de Java, debería estar bien para NTLM. Además, utilicé la URL predeterminada de SharePoint para acceder a los servicios web (no a las URL cargadas balanceadas).
La máquina que ejecuta la aplicación cliente no es un servidor de SharePoint. Tiene la Autenticación Integrada de Windows con NTLM configurado.
Además, debido a las políticas de administración de SharePoint, no puedo acceder a la Administración central de SharePoint ni hacer ningún cambio en la configuración (ni IIS).
Quiero preguntar si alguien sabe cuál es el problema. ¿Y si alguien sabe cómo solucionarlo?
Gracias por adelantado.
EDITAR:
Es importante mencionar que se otorgaron los mismos niveles de permiso en ambos entornos.
Tienes que deshabilitar la autenticación tranparent en java. Puedes hacer esto colocando un rt.jar personalizado o usando el reflejo para modificar las clases de Java.
tryTransparentNTLMServer y tryTransparentNTLMProxy son los campos en la HttpURLConnection que debe establecer accesible y luego a falso cuando se utiliza el método de reflexión. Obviamente solo cambia esta clase si haces tu propio rt.jar