Pregunta

Lo que estoy tratando de hacer:

  • Crear una página de inicio en la intranet de nuestra empresa que automáticamente obtenga el nombre de usuario de Windows que inició sesión de la persona que ve la página. sin a la persona se le solicita que ingrese estas credenciales cuando se carga la página.

  • Actualmente, solo quiero que tome el nombre de usuario local, ya que pasará un tiempo antes de que nuestros chicos de TI configuren el dominio.Por ejemplo, ahora mismo me gustaría que capturara "(Nombre de PC)\windows.user.name" sin ningún mensaje.

Ambiente:

  • Apache 2.2.21 en Windows 7 x64 (estará en CentOS una vez que esté en producción).

  • PHP 5.3.8 (VC9-ZTS).

  • Internet Explorer 9.0.8x y Firefox 6.0.2 (nos ocuparemos de Chrome más adelante).

  • La página de prueba actual es solo un script PHP que llama a print_r( $_SERVER ).

  • Para simplificar las cosas, el directorio en el que estoy probando esto no es un VirtualHost.

Pasos que he tomado hasta ahora:

  • Descargué mod_sspi_1.0.4-2.2.2 de SourceForge y extraje mod_auth_sspi.so al directorio de módulos de Apache.

  • Se agregó la declaración del módulo:

    LoadModule sspi_auth_module módulos/mod_auth_sspi.so

  • Se agregó la definición del directorio:

    EllowoverRide Ninguna Opción Ninguno Pedir Permitir, Denegar Permitir de todos

    AuthName "My Intranet"
    AuthType SSPI
    SSPIAuth On
    SSPIAuthoritative Off
    
    require valid-user
    

  • Habilitó la autenticación integrada en Firefox yendo a about:config y configurando network.automatic-ntlm-auth.trusted-uris en la ruta URL absoluta del script PHP y luego reinició Firefox.

  • Todavía no he realizado el paso equivalente en IE, pero lo haré una vez que Firefox funcione, ya que es nuestro principal navegador compatible internamente.

  • Reinicié Apache e intenté cargar el script PHP de prueba.

El resultado:

  • Tanto en IE como en Firefox, se me solicita un nombre de usuario y una contraseña antes de que se cargue la página.No quiero ese mensaje.Quiero que el nombre de usuario se detecte automáticamente sin avisar.

Solución de problemas hasta el momento:

  • Intenté recorrer las distintas opciones de SSPI, como activación/desactivación de autenticación y todo eso.Sin efecto.

  • El mensaje ya no aparece si elimino "requerir usuario válido", pero tampoco se pasa el nombre de usuario (no es NULL;simplemente no se establece en el período de la matriz).

  • Si presiono "Cancelar" en el mensaje, aparece la página estándar "Autenticación requerida".

  • Si ingreso un nombre de usuario no válido, o el nombre de usuario correcto pero con la contraseña incorrecta, la página se cargará pero el nombre de usuario será "(Nombre de PC)\Invitado".

  • Si ingreso el nombre de usuario y la contraseña correctos, se muestra el nombre de usuario en lugar de Invitado.

  • Una vez que ingreso un nombre de usuario/contraseña en IE o Firefox, el navegador recuerda que el nombre de usuario en la página siguiente se carga hasta que borro el caché de contraseñas almacenadas o reinicio el navegador.

  • He pasado las últimas 3 horas buscando en Google y adivinando al azar.Éxito cero.Encontré algunas publicaciones aisladas en foros de personas que hicieron esta pregunta, pero no obtuvieron respuesta o ofrecieron soluciones que ya probé sin éxito.

Nuevamente, lo que quiero es que la página se cargue, SIN ningún mensaje, y muestre el nombre de usuario de Windows actualmente conectado en la salida de la matriz $_SERVER.

Hasta donde puedo entender, esto es:Un problema de configuración de Windows, un problema de configuración de Apache o un problema de configuración del navegador.Aparte de eso, me he quedado sin ideas.

Estaría muy agradecido por cualquier ayuda que puedan ofrecer.¡Gracias!

--Kris

¿Fue útil?

Solución

Me tomó un par de días, pero finalmente lo descubrí por mi cuenta.Aparentemente, los diversos documentos y tutoriales que existen que describen la configuración about:config de Firefox son incorrectos.Afirman que se debe incluir el URI completo, incluido el prefijo de protocolo.Resulta que ocurre exactamente lo contrario.

Como un disparo aleatorio en la oscuridad, intenté configurarlo solo en "localhost" (el dominio en el que se ejecuta el servidor de prueba).¡Y voilá!¡Eso lo solucionó!"http://localhost", por otro lado, provocó que se rompiera.

Una vez que lo hice funcionar en Firefox, habiendo verificado que la configuración del lado del servidor era correcta, aplicarlo a IE y Chrome fue muy fácil.Para IE, acabo de agregar "http://localhost" (en este caso, desea el prefijo de protocolo) a la zona "Intranet".Y dado que Chrome utiliza la misma configuración de red que IE, ese paso lo hizo funcionar para ambos navegadores.

En lo que respecta a la configuración del lado del servidor, parece que la tuve desde el principio.Sin embargo, pude simplificarlo un poco, así que realmente todo lo que necesitas en el bloque de directorio es esto:

AuthName "Whatever you want to call your intranet"
AuthType SSPI
SSPIAuth On

require valid-user

Con esta configuración, si apunta a un script PHP que realiza print_r( $_SERVER ), la salida contendrá algo como esto:

[REMOTE_USER] => dev-kdc-pc01\kris.craig
[AUTH_TYPE] => NTLM
[PHP_AUTH_USER] => dev-kdc-pc01\kris.craig

Si desea deshacerse de la parte del dominio (es decir,"dev-kdc-pc01\"), puede analizarlo en PHP o agregar esta línea a su material SSPI en el bloque de directorio en httpd.conf mencionado anteriormente:

SSPIOmitDomain On

Tenga en cuenta que solo probé esto en un sistema Windows donde el servidor web Apache se ejecutaba en localhost.Todavía no lo he probado en una situación en la que el servidor Apache se ejecuta en Linux, aunque eso no debería tener ningún impacto en los resultados ya que el servidor simplemente acepta todo lo que le envía el navegador.Esto también requiere que el cliente ejecute Windows o algún otro entorno compatible con SSPI.Todavía no he determinado cómo hacer que esto funcione para nuestros empleados que usan Mac.

También tenga en cuenta que probé esto con éxito en una red que no no Actualmente tenemos un dominio configurado.Según artículos publicados en otros lugares, el comportamiento debería ser idéntico en una estación de trabajo que sea miembro de un dominio.

¡Espero que esto ayude!¡Gracias!

Otros consejos

Esta podría ser una respuesta parcial.

BOOL WINAPI GetUserName(
  __out    LPTSTR lpBuffer,
  __inout  LPDWORD lpnSize
);

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724432%28v=vs.85%29.aspx

Parece que puede obtener información sobre el sistema utilizando esto, la otra mitad podría estar automatizándola usando Perl o Python para raspar la información, luego publicarla en PHP.

Aquí está el esquema de obtener sysinfo en Windows.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724426%28v=vs.85%29.aspx

Honestamente, esto es algo bastante fácil de hacer con PECL/PAM si está usando Linux.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top