Pregunta

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

Sé que si Active Directory es el programa de instalación, puede utilizar el PHP LDAP módulo para conectar y autenticar en su guión, pero sin ANUNCIOS no hay LDAP.¿Cuál es el equivalente de máquinas independientes?

¿Fue útil?

Solución

No he encontrado una solución.Hay ejemplos de utilización de CreateObject y la carpeta WinNT proveedor ADSI.Pero eventualmente todos chocar La autenticación del usuario problemas con el Active Directory Service Interfaces proveedor de WinNT.No estoy 100% seguro, pero yo supongo el WSH/network connect enfoque tiene el mismo problema.
De acuerdo a Cómo validar las credenciales del usuario en los sistemas operativos de Microsoft usted debe utilizar 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.

En Windows XP, no es necesario que un proceso tiene el privilegio SE_TCB_NAME con el fin de llamar a LogonUser.Por lo tanto, el método más sencillo para validar las credenciales de un usuario en Windows XP, es llamar a la LogonUser de la API.

Por lo tanto, si yo fuera cierto Win9x / me/2000 de apoyo no es necesario, me gustaría escribir una extensión que expone LogonUser a php.
Usted también podría estar interesado en La Autenticación de usuario de NT Cuentas.Utiliza el w32api extensión, y necesita un support dll ...prefiero escribir que los pequeños LogonUser-extensión ;-)
Si eso no es posible me gustaría que probablemente se verá en el módulo fastcgi para IIS y cuán estable es y dejar que el IIS manejar la autenticación.

editar:
También he tratado de utilizar Sistema.De seguridad.Director.WindowsIdentity y php com/.red de extensión.Pero el dotnet constructor no parece permitir el paso de parámetros a los objetos constructor y mi "experimento" para obtener la asamblea (y con él, CreateInstance()) de GetType() ha fallado con un "desconocido zval de error".

Otros consejos

Buena Pregunta!

He dado a esto algún pensamiento...y no puedo pensar en una buena solución.Lo que puedo pensar es en una horrible horrible hack que sólo podría funcionar.Después de ver que nadie ha publicado una respuesta a esta pregunta durante casi un día, me di un mal, pero trabajando respuesta sería aceptar.

El archivo SAM está fuera de límites, mientras el sistema se está ejecutando.Hay algunos Inyección DLL trucos que usted puede ser capaz de obtener de trabajo pero al final te acaba de terminar con los hashes de contraseñas y que tendría para el hash al usuario las contraseñas para el partido contra ellos de todos modos.

Lo que realmente quiere es algo que intenta autenticar al usuario contra el archivo SAM.Creo que usted puede hacer esto haciendo algo como lo siguiente.

  1. Crear un recurso Compartido de Archivos en el servidor y hacerlo de modo que sólo las cuentas que usted quiere ser capaz de iniciar sesión en como tienen acceso a ella.
  2. En PHP utilizar el sistema de comando para invocar un script de wsh que:monta el recurso compartido utilizando el nombre de usuario y la contraseña que el usuario del sitio web proporciona.registros si funciona, y luego se desmonta la unidad si lo hace.
  3. Recoger el resultado de alguna manera.El resultado puede ser devuelto a php, ya sea en la salida estándar (stdout) de la secuencia de comandos, o se espera usar el código de retorno para la secuencia de comandos.

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

Me siento sucio :|

Editar:la razón por la invocación de la externa wsh script es que PHP no permitir el uso de rutas de acceso UNC (que yo recuerde).

La construcción de una extensión de PHP requiere un bastante gran inversión en términos de espacio en el disco duro.Pues ya tengo el GCC (MinGW) entorno instalado, he decidido dar el golpe en el rendimiento de poner en marcha un proceso desde el script PHP.El código fuente está a continuación.

// 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;
}

La siguiente es la fuente de PHP, demostrando 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top