Hay 3 protocolos de autenticación que se pueden utilizar para realizar la autenticación entre Java y Active Directory en Linux o cualquier otra plataforma (y estos no son sólo específico para los servicios HTTP):
Kerberos - Kerberos proporciona Single Sign-On (SSO) y delegación, pero los servidores web también necesitan el soporte de SPNEGO para aceptar SSO a través de IE.
NTLM - NTLM admite SSO a través de IE (y otros navegadores si están configurados correctamente).
LDAP - Se puede usar un enlace LDAP para validar simplemente un nombre de cuenta y contraseña.
También hay algo que se llama "AD FS", que proporciona SSO para sitios web utilizando SAML que pone en la SSP de Windows por lo que en la práctica es básicamente una manera indirecta de la utilización de uno de los otros protocolos anteriores.
Cada protocolo tiene sus ventajas, pero como regla general, para obtener la máxima compatibilidad, generalmente debe intentar "hacer lo mismo que Windows". Entonces, ¿qué hace Windows? En primer lugar, la autenticación entre dos máquinas Windows favorece a Kerberos porque los servidores no necesitan comunicarse con el DC y los clientes pueden almacenar en caché los tickets Kerberos lo que reduce la carga en los DC (y porque Kerberos admite la delegación).
Pero si las partes que autentican no tienen cuentas de dominio o si el cliente no puede comunicarse con el DC, se requiere NTLM. Así que Kerberos y NTLM no son mutuamente excluyentes y NTLM no está obsoleto por Kerberos. De hecho, en cierto modo, NTLM es mejor que Kerberos. Tenga en cuenta que al mencionar Kerberos y NTLM al mismo tiempo, también debo mencionar SPENGO y la Autenticación Integrada de Windows (IWA). IWA es un término simple que básicamente significa Kerberos, NTLM o SPNEGO para negociar Kerberos o NTLM.
El uso de un enlace LDAP como forma de validar las credenciales no es eficiente y requiere SSL. Pero hasta hace poco la implementación de Kerberos y NTLM ha sido difícil, por lo que el uso de LDAP como un servicio de autenticación make-shift ha persistido. Pero en este punto, generalmente se debe evitar. LDAP es un directorio de información y no un servicio de autenticación. Úselo para su propósito previsto.
Entonces, ¿cómo implementar Kerberos o NTLM en Java y en el contexto de las aplicaciones web en particular?
Hay una serie de grandes empresas como Quest Software y Centrify que tienen soluciones que mencionan específicamente Java. Realmente no puedo comentar sobre estos ya que son "soluciones de gestión de identidad" para toda la compañía, por lo que, al mirar el giro de marketing en su sitio web, es difícil decir exactamente qué protocolos se usan y cómo. Debería ponerse en contacto con ellos para obtener más detalles.
La implementación de Kerberos en Java no es muy difícil ya que las bibliotecas estándar de Java son compatibles con Kerberos a través de las clases org.ietf.gssapi. Sin embargo, hasta hace poco ha habido un obstáculo importante: IE no envía tokens Kerberos brutos, sino que envía tokens SPNEGO. Pero con Java 6, se ha implementado SPNEGO. En teoría, debería poder escribir algún código GSSAPI que pueda autenticar a los clientes de IE. Pero no lo he intentado. La implementación de Sun de Kerberos ha sido una comedia de errores a lo largo de los años, por lo que, basado en el historial de Sun en esta área, no haría ninguna promesa sobre su implementación de SPENGO hasta que tenga ese ave en la mano.
Para NTLM, hay un proyecto de OSS gratuito llamado JCIFS que tiene un filtro de servlet de autenticación HTTP NTLM. Sin embargo, utiliza un método man-in-the-middle para validar las credenciales con un servidor SMB que no funciona con NTLMv2 (que lentamente se está convirtiendo en una política de seguridad de dominio requerida). Por ese motivo y otros, la parte del Filtro HTTP de JCIFS está programada para ser eliminada. Tenga en cuenta que hay un número de spin-offs que usan JCIFS para implementar la misma técnica. Por lo tanto, si ve otros proyectos que afirman ser compatibles con NTOS de NTLM, consulte la letra pequeña.
La única forma correcta de validar las credenciales NTLM con Active Directory es utilizar la llamada NetrLogonSamLogon DCERPC sobre NETLOGON con Secure Channel. ¿Existe tal cosa en Java? Sí.Aquí está:
http://www.ioplex.com/jespa.html
Jespa es una aplicación 100% Java que soporta NTLM NTLMv2, NTLMv1, opciones de integridad y confidencialidad completa y la validación de credenciales NETLOGON antes mencionado. E incluye un filtro HTTP SSO, un JAAS LoginModule, cliente HTTP, cliente y servidor SASL (con enlace JNDI), "proveedor de seguridad" genérico para crear servicios personalizados NTLM y más.
Mike
'import com.sun.jndi.ldap.LdapCtxFactory;' - esto probablemente solo funcionará con Sun JVM. –