tiempo - php obtener usuario logueado windows
Autenticación NTLM: obtenga inicio de sesión de Windows, dominio y host en PHP (2)
Cuando intento con Firefox, recibo una solicitud para un inicio de sesión y una contraseña. Cuando publico la solicitud, la secuencia de comandos obtiene el inicio de sesión de la solicitud, pero esto no es lo que quiero hacer: tengo que hacer que esto funcione con IE, y no quiero volver a escribir el inicio de sesión y la contraseña. Quiero el inicio de sesión de la sesión actual de Windows.
Puedes eliminar el aviso, cambiando la configuración de Firefox:
- Escribe: "about: config" en la barra de direcciones
- Compruebe la red.automatic-ntlm-auth.trusted-uris
- Establezca el valor en su dominio, o parte del dominio, por ejemplo, mycompany.com (sepárelo con varios valores de coma)
Para IE, debe establecer una configuración de seguridad más baja para su página (intranet) que para el resto de Internet. Consulte https://superuser.com/questions/148063/why-does-internet-explorer-keep-asking-me-for-ntlm-credentials-in-an-intranet-zo
Estoy trabajando en una aplicación PHP de inicio de sesión único (SSO).
Los usuarios inician sesión en su sesión de Windows y desean iniciar sesión automáticamente en la aplicación con su cuenta de Windows (conectada con Active Directory de LDAP).
Probé este guión:
<?php
$headers = apache_request_headers(); // Récupération des l''entêtes client
if (@$_SERVER[''HTTP_VIA''] != NULL){ // nous verifions si un proxy est utilisé : parceque l''identification par ntlm ne peut pas passer par un proxy
echo "Proxy bypass!";
} elseif(!isset($headers[''Authorization''])) { //si l''entete autorisation est inexistante
header( "HTTP/1.0 401 Unauthorized" ); //envoi au client le mode d''identification
header( "WWW-Authenticate: NTLM" ); //dans notre cas le NTLM
exit; //on quitte
}
if(isset($headers[''Authorization''])) //dans le cas d''une authorisation (identification)
{
if(substr($headers[''Authorization''],0,5) == ''NTLM ''){ // on vérifit que le client soit en NTLM
$chaine=$headers[''Authorization''];
$chaine=substr($chaine, 5); // recuperation du base64-encoded type1 message
$chained64=base64_decode($chaine); // decodage base64 dans $chained64
if(ord($chained64{8}) == 1){
// |_ byte signifiant l''etape du processus d''identification (etape 3)
// verification du drapeau NTLM "0xb2" à l''offset 13 dans le message type-1-message (comp ie 5.5+) :
if (ord($chained64[13]) != 178){
echo "NTLM Flag error!";
exit;
}
$retAuth = "NTLMSSP".chr(000).chr(002).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000);
$retAuth .= chr(000).chr(040).chr(000).chr(000).chr(000).chr(001).chr(130).chr(000).chr(000);
$retAuth .= chr(000).chr(002).chr(002).chr(002).chr(000).chr(000).chr(000).chr(000).chr(000);
$retAuth .= chr(000).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000);
$retAuth64 =base64_encode($retAuth); // encode en base64
$retAuth64 = trim($retAuth64); // enleve les espaces de debut et de fin
header( "HTTP/1.0 401 Unauthorized" ); // envoi le nouveau header
header( "WWW-Authenticate: NTLM $retAuth64" ); // avec l''identification supplémentaire
exit;
} else if(ord($chained64{8}) == 3) {
// |_ byte signifiant l''etape du processus d''identification (etape 5)
// on recupere le domaine
$lenght_domain = (ord($chained64[31])*256 + ord($chained64[30])); // longueur du domain
$offset_domain = (ord($chained64[33])*256 + ord($chained64[32])); // position du domain.
$domain = str_replace("/0","",substr($chained64, $offset_domain, $lenght_domain)); // decoupage du du domain
//le login
$lenght_login = (ord($chained64[39])*256 + ord($chained64[38])); // longueur du login.
$offset_login = (ord($chained64[41])*256 + ord($chained64[40])); // position du login.
$login = str_replace("/0","",substr($chained64, $offset_login, $lenght_login)); // decoupage du login
$lenght_host = (ord($chained64[47])*256 + ord($chained64[46]));
$offset_host = (ord($chained64[49])*256 + ord($chained64[48]));
$host = str_replace("/0","",substr($chained64, $offset_host, $lenght_host));
if ( $login != NULL){
echo $login;
} else {
echo "NT Login empty!";
}
}
}
}
?>
Este script está trabajando en esta configuración:
- Servidor de Windows 2003
- Apache 2.2 con mod_auth_sspi modulo
Pero ahora necesito implementar esto en esta configuración y no funciona:
- Servidor Windows 2008
- Apache 2.4.6 con módulo mod_authnz_sspi
Sigo recibiendo "Error de marca NTLM!", Debido a esta condición:
if (ord($chained64[13]) != 178){
echo "NTLM Flag error!";
exit;
}
Lo intenté :
if (ord($chained64[13]) != 130){
porque ord ($ chained64 [13]) devuelve 130, pero no puedo ir en esta condición:
} else if(ord($chained64{8}) == 3) {
$lenght_domain = (ord($chained64[31])*256 + ord($chained64[30])); // longueur du domain
$offset_domain = (ord($chained64[33])*256 + ord($chained64[32])); // position du domain.
$domain = str_replace("/0","",substr($chained64, $offset_domain, $lenght_domain)); // decoupage du du domain
//le login
$lenght_login = (ord($chained64[39])*256 + ord($chained64[38])); // longueur du login.
$offset_login = (ord($chained64[41])*256 + ord($chained64[40])); // position du login.
$login = str_replace("/0","",substr($chained64, $offset_login, $lenght_login)); // decoupage du login
$lenght_host = (ord($chained64[47])*256 + ord($chained64[46]));
$offset_host = (ord($chained64[49])*256 + ord($chained64[48]));
$host = str_replace("/0","",substr($chained64, $offset_host, $lenght_host));
if ( $login != NULL){
echo $login;
} else {
echo "NT Login empty!";
}
}
Porque ord($chained64{8})
siempre devuelve 1.
Editar 2015-05-11:
Intenté ejecutar el comando ''whoami'' en php, así:
echo exec(''whoami'');
-> cuando ejecuto este comando en cmd.exe, obtengo el usuario actual registrado, pero cuando lo ejecuto en PHP, obtengo nt_authora / system.Supuse que cuando PHP ejecuta el comando ''whoami'', Windows comprueba el inicio de sesión del servicio Apache. Entré en las propiedades de Apache, en la pestaña "Iniciar sesión", para iniciar sesión como usuario válido de Active Directory. Pero entonces, cuando PHP ejecuta
echo exec(''whoami'');
, Solo obtengo el inicio de sesión utilizado para Apache, y no el usuario actual.Estoy usando Internet Explorer 8 para ejecutar el script PHP.
Tengo esto en mi httpd.conf de Apache (
_PATH_
es la ruta a mis archivos php, tal vez esto sea incorrecto?):<Directory "E:/_PATH_"> Options None AllowOverride All Order allow,deny Allow from all AuthName "SSPI Protected Place" AuthType SSPI SSPIAuth On SSPIAuthoritative On SSPIOfferBasic On SSPIOmitDomain On Require valid-user </Directory>
Edición 2015-05-12:
Estoy registrado como usuario de dominio en la máquina
Cuando intento con Firefox, recibo una solicitud para un inicio de sesión y una contraseña. Cuando publico la solicitud, la secuencia de comandos obtiene el inicio de sesión de la solicitud, pero esto no es lo que quiero hacer: tengo que hacer que esto funcione con IE, y no quiero volver a escribir el inicio de sesión y la contraseña. Quiero el inicio de sesión de la sesión actual de Windows.
En Firefox entré en about: config para configurar network.automatic-ntlm-auth.trusted-uris en mi dominio, gracias a @ThaDafinser. Ahora ya no recibo un aviso en Firefox y todo funciona, pero siempre necesito hacer que funcione en IE.
En IE, configuro la Seguridad de la Intranet local en la más baja, pero nada cambió.
En IE, se comprueba "Inicio de sesión automático con el nombre de usuario y la contraseña actuales" para Intranet local y Sitios de confianza.
Cuando obligo a IE a solicitar credenciales en un aviso, si publico el aviso, IE no devuelve las credenciales, a diferencia de Firefox.
Edición 2015-05-13:
Agregué la URL a los sitios de confianza en IE, nada cambió.
Puse la seguridad a bajo para los sitios de confianza, nada cambió.
Desmarque "Usar HTTP 1.1 a través de conexiones proxy" en IE> Opciones de Internet> Avanzado, aún no puedo tener información de sesión en Internet Explorer, incluso si uso el indicador.
Agregué la URL completa en Internet Explorer> Opciones de Internet> Seguridad> Intranet local> Sitios> Avanzado
En Internet Explorer> Opciones de Internet> Seguridad> Intranet local> Sitios> Avanzado, también agregué la misma parte del dominio (myempresa.com) que agregué en Firefox para que funcione, pero esto no ayudó.
Edición 2015-05-18:
Cambié mi httpd.conf para que fuera compatible con Apache 2.4, según lo que @timclutton dijo en su respuesta:
<Directory "E:/_PATH_">
Require all denied
AllowOverride All
Options None
AuthName "SSPI Authentication"
AuthType SSPI
SSPIAuth On
SSPIAuthoritative On
SSPIOmitDomain On
Require valid-user
Require user "NT AUTHORITY/ANONYMOUS LOGON" denied
</Directory>
Edición 2015-05-19:
Intenté establecer una autenticación básica en SSPI y no funciona.
AuthType Basic AuthName "Authentication Required" AuthUserFile "E: / PATH /.htpasswd" Require valid-user
Orden permitir, negar Permitir de todos
El módulo mod_authnz_sspi
maneja todos los aspectos del proceso de autenticación de manera transparente, lo que significa que no hay necesidad de su script de autenticación de PHP. Si el módulo está configurado correctamente, simplemente debería poder hacer referencia a $_SERVER[''REMOTE_USER'']
en su script. Cualquier usuario que no pueda ser autenticado recibirá un Apache 403 - Forbidden
estándar 403 - Forbidden
Error 403 - Forbidden
.
Sospecho que el problema está en su httpd.conf
ya que está usando la sintaxis de Apache 2.2 para allow/deny
y esto no funcionará en Apache 2.4 (a menos que tenga el módulo mod_access_compat
habilitado). Debe leer Actualizar a 2.4 de 2.2 en la documentación de Apache.
Asegúrese de que E:/_PATH_
sea la carpeta exacta desde la que se ejecuta el script PHP y todas las solicitudes a esa ruta requerirán autenticación.
Lo siguiente funciona para mí en Apache 2.4:
<Directory "/path/to/webroot">
AllowOverride All
Options ExecCGI
# since I run PHP via mod_fcgi; should also work as ''Options none''.
AuthName "SSPI Authentication"
AuthType SSPI
SSPIAuth On
SSPIAuthoritative On
SSPIOmitDomain On
Require valid-user
Require user "NT AUTHORITY/ANONYMOUS LOGON" denied
</Directory>