29

Me gustaría que mi aplicación Java de escritorio tenga inicio de sesión único relacionado con usuarios de Active Directory. En dos pasos, me gustaría:¿Cómo usar el inicio de sesión de Windows para el inicio de sesión único y para las entradas de Active Directory para la aplicación Desktop Java?

  1. Asegúrese de que el usuario en particular haya iniciado sesión en Windows con alguna entrada de usuario.
  2. Si te preguntas por información de configuración para ese usuario de Active Directory

Con Java: Programatic Way to Determine Current Windows User puedo obtener el nombre del usuario actual de Windows, pero puedo confiar a eso? Creo que el

System.getProperty("user.name") 

no será lo suficientemente seguro? ("User.name" parece conseguidos de las variables de entorno, por lo que no puede confiar en eso, creo?)

Pregunta Authenticating against Active Directory with Java on Linux me proporciona la autenticación de nombre dado + pasar pero me gustaría para autenticar basado en el inicio de sesión de Windows?

Para el acceso a Active Directory, ¿el LDAP sería probablemente la elección?

No estoy del todo seguro si estoy haciendo las preguntas correctas pero espero que alguien tenga algunas ideas para transmitirme.

Respuesta

13

No es compatible. Java 6 tiene mejoras, pero aún no es suficiente.

Java tiene su propia pila GSS. El problema es para el inicio de sesión único, necesita obtener el boleto de Kerberos del sistema operativo (no la pila de Java). De lo contrario, el usuario tiene que autenticarse por segunda vez (lo que frustra el objetivo del inicio de sesión único).

Mire http://java.sun.com/developer/technicalArticles/J2SE/security/. Mire hacia abajo para "Acceder a GSS-API nativa" y se trata de una nueva propiedad del sistema sun.security.jgss.native que, cuando se establece en verdadero, hace que Java utilice la implementación de OS GSS subyacente, dando acceso a la autenticación de nivel del sistema operativo. ¡Perfecto! ... excepto que solo es compatible con Solaris y Linux, no con Microsoft Windows.

Java 6 sin embargo parece tener suficiente soporte para actuar como un servidor recibiendo solicitudes de autenticación SPNEGO de IE y luego autenticando a ese usuario contra Active Directory. Es solo el soporte de escritorio del cliente que aún está incompleto.

+0

¿Alguna otra JVM proporciona acceso al ticket de Kerberos como se describe? –

+1

Parece que Java 8 tiene ese soporte, sin embargo. https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/jgss-features.html – Ramiro

0

Ha considerado el uso de la API de JNA (le permite hacer llamadas nativas al sistema operativo fácil)?

Puede llamar a la documentación de win32 metod GetCurrentUser MSDN al http://msdn.microsoft.com/en-us/library/ms724432(VS.85).aspx. Está ubicado dentro de Advapi32.dll.

También tiene una versión Unicode, GetCurrentUserW si es necesario.

Y tienes razón. Parece que la variable de entorno puede cambiarse, por lo que puede ser engañoso de usar.

No estoy seguro acerca de las implicaciones de plataforma cruzada en las ventanas de 32/64 bits. Si necesita la solución en código, estoy seguro de que podría escribir algo para eso.

Pero sí, sólo una idea :)

5

Uso JAAS con un LDAP LoginModule. Esto le permitirá conectarse a la infraestructura de seguridad subyacente de Java.

Cuando necesite desconectar la aplicación o "depurar" la aplicación, puede cambiar fácilmente el módulo LDAP por un módulo ficticio. Esto le permite continuar probando su "seguridad", sin depender de Active Directory. Altamente comprobable, desacoplado, y usted puede hacer el esquema de autenticación en un momento posterior casi sin dolor.

+0

Gracias, ¿Admite la autenticación mediante el inicio de sesión de Windows? (De modo que cuando el usuario está conectado a Windows, no tiene que ingresar el nombre de usuario y la contraseña para la aplicación java por separado) Al principio no lo encontré, tengo que seguir mirando. – Touko

+0

Hmmm. Los únicos módulos que he visto que hacen eso son parte de un marco más grande como WebLogic ... o están diseñados para que el cliente de Java pase credenciales a un servidor web. Puede que tenga que escribir un pequeño proveedor de JAAS usando llamadas nativas para hacer esto de manera confiable. –

+2

En lugar de utilizar LDAP LoginModule, el Krb5LoginModule parece ser capaz de usar el caché de tickets del sistema operativo (las credenciales se obtuvieron en el inicio de sesión de Windows) cuando se usa con el parámetro useTicketCache. Parece que todavía hay algunos problemas, pero esto funciona por ahora ... – Touko

0

Probablemente obtendrá la mayor flexibilidad utilizando Spring Security. Puede usarlo con autenticación JAAS y LDAP.

2

sólo para el beneficio de otros leyendo este hilo, http://www.javaactivedirectory.com/?page_id=196 tiene un ejemplo de cómo hacer inicio de sesión único con Windows/Active Directory

+0

La misma idea que James Schek pero tiene instrucciones claras, ¡gracias! La única desventaja importante que aún queda, debe complicarse con el registro de Windows (allowtgtsessionkey Registry Key) que no es posible en todos los casos (problemas con la instalación + a todas las personas no les gusta que se cambie el registro) – Touko

+3

lamentablemente el enlace está roto y no es fácil determinable :-((-1) –

4

Proyecto Waffle tiene tanto código de cliente y de servidor para hacer SSO en Windows. Está basado en JNA, no se requieren bibliotecas nativas.

+0

Esto funciona solo para windows server y client –

Cuestiones relacionadas