7

Aquí está el escenario. Soy un código que se ejecuta en un servidor web en un dominio AD. Algún cliente me ha conectado ¿Cómo obtengo el nombre de usuario de ese cliente sin que el cliente complete un formulario en su navegador? Debe usar tecnologías Java en el lado del servidor web.Obtener el nombre de usuario del cliente que se conectó al servidor web

edición:

Terminé usando la primavera de Seguridad Negociar filtro tal como se describe en el siguiente enlace. Hay un tutorial disponible. El uso de request.getPrincipal(). GetName() desde dentro de un servlet da el nombre de usuario.

http://waffle.codeplex.com/

+0

@DA .. :) .. btw, la razón de eso es que estoy usando Tomcat y la primavera. – KyleM

+0

No hay ningún nombre de usuario. Su solicitud es intrínsecamente sin sentido, a menos que esté en un dominio AD. – SLaks

+0

@Slaks Estoy en un dominio AD. Perdón por no incluir esa información esencial. – KyleM

Respuesta

11

Debe configurar el Spring Security Kerberos extension - esta es la única manera de hacer lo que describe en Spring Security 3. Esto es compatible con la negociación de SPNEGO, pero requiere cierta cantidad de configuración en el servidor (y conocimiento de cómo funcionan SPNEGO y Kerberos).

No hay mucha documentación, pero las aplicaciones de muestra de Mike que envía con 1.0M2 son geniales y cubren la mayoría de los escenarios comunes, incluida la autenticación automática SPNEGO.

La clave para SPNEGO es la creación de una costumbre AuthenticationEntryPoint - tendrá que hacer esto con un grano de la primavera de encargo de la siguiente manera:

<bean id="kerbEntryPoint" class="org.springframework.security.extensions.kerberos.web.SpnegoEntryPoint" /> 

<bean id="kerbAuthenticationProcessingFilter" class="org.springframework.security.extensions.kerberos.web.SpnegoAuthenticationProcessingFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
</bean> 

... hay más frijoles que va a ser requerido además de estos (de nuevo, consulte las muestras con la extensión Kerberos). Publique de nuevo si avanza con Spring Security o si desea detalles exactos (dado que hay una cantidad de beans/config bits involucrados, algún conocimiento de su configuración sería útil, como si está usando el estilo de espacio de nombres <http> o no)

Aparte de esta opción, tendría que configurar un tipo similar de autorización de SPNEGO (como usar WAFFLE, como sugiere) - other SO questions cubra esto bastante bien.

Finalmente, es posible que frente a Tomcat con otro servidor web que sea mejor compatible con SPNEGO o NTLM, como Microsoft IIS o Servidor web Apache con mod_spnego.

¡Espero que una de estas ideas funcione para usted!

+0

Gracias Peter. Preferiría una solución como Waffle que funcione con Kerberos o sin ella, así que creo que me quedaré con eso. De todos modos, gracias por la ayuda y los enlaces. – KyleM

+0

Solo para aclararlo: si está en un dominio de AD como lo describe, probablemente ya esté ejecutando Kerberos - W2K3 y, por lo general, lo tiene habilitado de manera predeterminada. –

2

La última manera para que haga Windows es SPNEGO. Para que funcione completamente, necesita que su servidor tenga una cuenta en AD y se comunique con Kerberos. Entonces Spring Security, me dijeron, apoya esto.

Ahora, no siempre es necesario autorizar a los usuarios. Algunas veces (por ejemplo, por razones de estadísticas) es suficiente obtener la ID AD del usuario. Cuando estaba jugando con SPNEGO, los datos binarios que se pasaron desde el navegador incluían la identificación del usuario en texto claro. Se puede extraer de allí, pero no se puede confiar, por supuesto.

NTLM está desactualizado, se considera menos seguro y se ha implementado en su mayoría en entornos.

+0

No necesito autenticar al usuario, solo mire su nombre de usuario o "ID AD" como dijo. – KyleM

6

¿Qué navegador están utilizando sus usuarios? Si IE; hay una solución simple:

<html> 
<script type="text/javascript"> 
var WinNetwork = new ActiveXObject("WScript.Network"); 
alert(WinNetwork.UserName); 
</script> 
</html> 
+1

Gracias, pero como he dicho "debe usar tecnologías Java en el lado del servidor web". JS no lo corta porque un usuario motivado podría enviarme el nombre de usuario que quiera. Tener un voto positivo de todos modos. – KyleM

+0

Imaginaba en un entorno controlado que no habría motivado a los usuarios, de todos modos, gracias por el voto popular. – abalogh

+0

Tiene razón: dudo que un usuario en mi entorno intente (o siquiera sepa cómo) hacerlo, pero estoy siendo extremadamente cauteloso, y no me duele por el simple hecho de aprender. – KyleM

1

Si está utilizando Tomcat, a continuación, utilizar WAFFLE.

0

Apuesto a que puede poner el servidor web Apache delante de tomcat para que apache pueda autenticarse usando NTLM o Kerberos. Luego puede usar reglas de reescritura para enviar solicitudes a tomcat con nombre de usuario en el plano. Esto es solo una idea, no lo he implementado yo mismo. Sin embargo, estamos utilizando la autenticación Apache Kerberos en nuestra intranet. Mi sugerencia es no utilizar NTLM, está desactualizado y es escamoso.

Cuestiones relacionadas