Frage

Ich bin mit PHP, Apache und Windows. Ich habe keine Domain-Setup, also würde ich meine Website formularbasierte Authentifizierung wie die lokalen Benutzer verwenden Datenbank in Windows eingebauten Konten (ich glaube, es SAM heißt).

Ich weiß, dass, wenn Active Directory-Setup ist, können Sie das PHP-LDAP-Modul verwenden, um in Ihrem Skript zu verbinden und zu authentifizieren, aber ohne AD gibt es keine LDAP. Was ist das Äquivalent für den Standalone-Maschinen?

War es hilfreich?

Lösung

Ich habe nicht eine einfache Lösung entweder gefunden. Es gibt Beispiele und die Create WinNT ADSI-Anbieter verwendet wird. Aber schließlich sie alle stoßen auf Die Benutzerauthentifizierung Probleme mit dem Active Directory Service Interfaces WinNT Anbieter . Ich bin nicht 100% sicher, aber ich erraten die WSH / Netzwerk verbindet Ansatz hat das gleiche Problem.
Nach Wie Benutzer-Credentials auf Microsoft-Betriebssystemen zu validieren Logonuser oder SSPI verwenden sollten.
Er sagt auch,

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.

Deshalb, wenn ich Unterstützung bestimmter Win9x / 2000 waren nicht erforderlich ist, würde ich eine Erweiterung schreiben, die Logonuser aussetzt PHP.
Vielleicht haben Sie auch Benutzer interessiert sein Authentifizierung von NT-Konten . Es nutzt die w32api Erweiterung und braucht eine Unterstützung dll ... Ich würde eher, dass kleine Logonuser-Erweiterung schreiben ;-)
Wenn das nicht möglich ist, würde ich wahrscheinlich das FastCGI-Modul für IIS schauen und wie stabil sie ist, und lassen Sie die IIS die Authentifizierung umgehen.

edit:
Ich habe auch versucht, zu verwenden, System.Security.Principal .WindowsIdentity und php com / .net Erweiterung . Aber der Dotnet-Konstruktor scheint nicht Gabe von Parametern an die Objekte Konstruktor und mein „Experiment“, um die Montage (und mit ihm CreateInstance ()) von GetType () ausgefallen ist mit einem „unbekannten zval“ Fehler zu ermöglichen.

Andere Tipps

Gute Frage!

Ich habe diese nachgedacht ... und ich kann eine gute Lösung nicht denken. Was ich denken kann ist eine schreckliche schreckliche Hack, der nur funktionieren könnte. Nachdem ich, dass niemand eine Antwort auf diese Frage für fast einen Tag gebucht hat, dachte ich, ein schlechtes, aber ok wäre Antwort zu arbeiten.

Die SAM-Datei ist tabu, während das System läuft. Es gibt einige DLL Injection Tricks, die Sie in der Lage sein können, zum Laufen zu bringen, aber am Ende werden Sie nur mit Passwort-Hashes am Ende und man müßte die Benutzer zur Verfügung gestellt Passwörter Hash gegen sie trotzdem entsprechen.

Was Sie wirklich wollen, ist etwas, das der Benutzer gegen die SAM-Datei zu authentifizieren versucht. Ich glaube, Sie können dies tun, indem so etwas wie die folgenden zu tun.

  1. Erstellen Sie eine Dateifreigabe auf dem Server und machen es so, nur dass Konten, die Sie sich einloggen, um der Lage sein soll als Zugang zu ihm gewährt werden.
  2. In PHP verwenden, um die Systembefehl ein WSH-Skript aufrufen, die: den Anteil besteigt den Benutzernamen und das Kennwort ein, dass der Website-Benutzer bereitstellt. Aufzeichnungen, wenn es funktioniert, und dann unmounts das Laufwerk, wenn es funktioniert.
  3. Collect das Ergebnis irgendwie. Das Ergebnis kann zurückgegeben werden, entweder auf dem stdout des Skripts PHP, oder hoffentlich den Return-Code für das Skript.

Ich weiß, es ist nicht schön, aber es sollte funktionieren.

Ich fühle mich schmutzig: |

Edit:. Grund für die externe WSH-Skript aufgerufen wird, ist, dass PHP nicht zulässt, dass UNC-Pfade verwenden (soweit ich mich erinnern kann)

Der Aufbau einer PHP-Erweiterung erfordert eine ziemlich große Investition in Bezug auf Festplattenspeicher. Da ich schon die GCC (MinGW) Umgebung installiert haben, habe ich beschlossen, die Leistungseinbußen bei der Einführung eines Prozesses aus dem PHP-Skript zu nehmen. Der Quellcode ist unten.

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

Als nächstes ist die PHP-Quelle seine Verwendung zu demonstrieren.     

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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top