validar usuarios usuario usando sistema sesiones registro para múltiples formularios formulario ejemplos datos control contraseña con completo codigo autentificación autenticación administrador php windows apache authentication sam

usuarios - Autenticación basada en formularios PHP en Windows utilizando cuentas de usuario locales



login y registro con php y base de datos mysql (3)

¡Buena pregunta!

He pensado un poco ... y no puedo pensar en una buena solución. Lo que puedo pensar es un truco horrible y horrible que podría funcionar. Después de ver que nadie ha publicado una respuesta a esta pregunta durante casi un día, pensé que era una respuesta incorrecta, pero funcionaría.

El archivo SAM está fuera de los límites mientras el sistema se está ejecutando. Hay algunos trucos de inyección de DLL que puede ser capaz de obtener, pero al final terminarás con hash de contraseñas y tendrías que ajustar las contraseñas proporcionadas por el usuario para que coincidan con ellas de todos modos.

Lo que realmente quieres es algo que intente autenticar al usuario contra el archivo SAM. Creo que puedes hacer esto haciendo algo como lo siguiente.

  1. Cree un recurso compartido de archivos en el servidor y configúrelo para que solo las cuentas que desee puedan iniciar sesión tengan acceso a ellas.
  2. En PHP use el comando del sistema para invocar un script wsh que: monta el recurso compartido usando el nombre de usuario y la contraseña que proporciona el usuario del sitio web. registra si funciona, y luego desmonta el disco si lo hace.
  3. Recoge el resultado de alguna manera. El resultado puede devolverse a php ya sea en la salida estándar del script o, con suerte, utilizando el código de retorno para el script.

Sé que no es bonita, pero debería funcionar.

Me siento sucio: |

Editar: el motivo para invocar el script wsh externo es que PHP no le permite usar rutas UNC (hasta donde puedo recordar).

Estoy ejecutando PHP, Apache y Windows. No tengo una configuración de dominio, por lo que me gustaría que la autenticación basada en formularios de mi sitio web utilice la base de datos de cuentas de usuario local integrada en Windows (creo que se llama SAM).

Sé que si se configura Active Directory, puede usar el módulo PHP LDAP para conectarse y autenticarse en su secuencia de comandos, pero sin AD no hay LDAP. ¿Cuál es el equivalente para máquinas independientes?


Construir una extensión de PHP requiere una inversión bastante grande en términos de espacio en el disco duro. Como ya tengo instalado el entorno GCC (MinGW), he decidido tomar el golpe de rendimiento de iniciar un proceso desde el script PHP. El código fuente está abajo.

// Usage: logonuser.exe /user username /password password [/domain domain] // Exit code is 0 on logon success and 1 on failure. #include <windows.h> int main(int argc, char *argv[]) { HANDLE r = 0; char *user = 0; char *password = 0; char *domain = 0; int i; for(i = 1; i < argc; i++) { if(!strcmp(argv[i], "/user")) { if(i + 1 < argc) { user = argv[i + 1]; i++; } } else if(!strcmp(argv[i], "/domain")) { if(i + 1 < argc) { domain = argv[i + 1]; i++; } } else if(!strcmp(argv[i], "/password")) { if(i + 1 < argc) { password = argv[i + 1]; i++; } } } if(user && password) { LogonUser(user, domain, password, LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, &r); } return r ? 0 : 1; }

Luego está la fuente PHP que demuestra su uso.

if($_SERVER[''REQUEST_METHOD''] == ''POST'') { if(isset($_REQUEST[''user''], $_REQUEST[''password''], $_REQUEST[''domain''])) { $failure = 1; $user = $_REQUEST[''user'']; $password = $_REQUEST[''password'']; $domain = $_REQUEST[''domain'']; if($user && $password) { $cmd = "logonuser.exe /user " . escapeshellarg($user) . " /password " . escapeshellarg($password); if($domain) $cmd .= " /domain " . escapeshellarg($domain); system($cmd, $failure); } if($failure) { echo("Incorrect credentials."); } else { echo("Correct credentials!"); } } } ?> <form action="<?php echo(htmlentities($_SERVER[''PHP_SELF''])); ?>" method="post"> Username: <input type="text" name="user" value="<?php echo(htmlentities($user)); ?>" /><br /> Password: <input type="password" name="password" value="" /><br /> Domain: <input type="text" name="domain" value="<?php echo(htmlentities($domain)); ?>" /><br /> <input type="submit" value="logon" /> </form>


No he encontrado una solución simple tampoco. Hay ejemplos que usan CreateObject y el proveedor ADSI de WinNT. Pero finalmente todos se topan con problemas de autenticación de usuario con el proveedor WinNT de Interfaces de servicio de Active Directory . No estoy 100% seguro, pero creo que el enfoque de conexión de WSH / red tiene el mismo problema.
De acuerdo con Cómo validar las credenciales del usuario en los sistemas operativos de Microsoft, debe usar LogonUser o SSPI.
También dice

LogonUser Win32 API does not require TCB privilege in Microsoft Windows Server 2003, however, for downlevel compatibility, this is still the best approach.

On Windows XP, it is no longer required that a process have the SE_TCB_NAME privilege in order to call LogonUser. Therefore, the simplest method to validate a user''s credentials on Windows XP, is to call the LogonUser API.

Por lo tanto, si estuviera seguro de que no se necesita la compatibilidad Win9x / 2000, escribiría una extensión que expone LogonUser a php.
Es posible que también esté interesado en Autenticación de usuario desde Cuentas NT . Utiliza la extensión w32api, y necesita una dll de soporte ... Preferiría escribir esa pequeña extensión LogonUser ;-)
Si eso no es factible, probablemente examinaría el módulo fastcgi para IIS y qué tan estable es y dejaré que el IIS maneje la autenticación.

editar:
También he intentado utilizar System.Security.Principal.WindowsIdentity y la extensión com / .net de php. Pero el constructor de la red de punto no parece permitir pasar los parámetros al constructor de objetos y mi "experimento" para obtener el ensamblado (y con él CreateInstance ()) de GetType () ha fallado con un error de "zval desconocido".