Wie kann ich einen Benutzernamen und ein Passwort anhand von Active Directory überprüfen? Ich möchte einfach überprüfen, ob ein Benutzername und ein Passwort korrekt sind.
526
Wie kann ich einen Benutzernamen und ein Passwort anhand von Active Directory überprüfen? Ich möchte einfach überprüfen, ob ein Benutzername und ein Passwort korrekt sind.
Wenn Sie mit .NET 3.5 oder höher arbeiten, können Sie den System.DirectoryServices.AccountManagement
Namespace verwenden und Ihre Anmeldeinformationen einfach überprüfen:
// create a "principal context" - e.g. your domain (could be machine, too)
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"))
{
// validate the credentials
bool isValid = pc.ValidateCredentials("myuser", "mypassword");
}
Es ist einfach, es ist zuverlässig, es ist 100% C # -verwalteter Code auf Ihrer Seite - was können Sie mehr verlangen? :-)
Lesen Sie hier alles darüber:
Aktualisieren:
Wie in dieser anderen SO-Frage (und ihren Antworten) beschrieben , gibt es ein Problem mit diesem Aufruf, bei dem möglicherweise True
alte Kennwörter eines Benutzers zurückgegeben werden. Sei dir dieses Verhaltens bewusst und sei nicht zu überrascht, wenn dies passiert :-) (danke an @MikeGledhill für den Hinweis!)
UserPrinciple.FindByIdentity
um festzustellen, ob die übergebene Benutzer-ID zuerst vorhanden ist.ContextOptions.Negotiate
.Wir machen das in unserem Intranet
Sie müssen System.DirectoryServices verwenden.
Hier sind die Eingeweide des Codes
quelle
strPassword
in LDAP im Klartext gespeichert wird?Close()
eineusing
Variable explizit aufzurufen .Bei einigen hier vorgestellten Lösungen kann nicht zwischen einem falschen Benutzer / Passwort und einem Passwort unterschieden werden, das geändert werden muss. Dies kann folgendermaßen erfolgen:
Wenn das Benutzerpasswort falsch ist oder der Benutzer nicht existiert, enthält der Fehler
"8009030C: LdapErr: DSID-0C0904DC, Kommentar: AcceptSecurityContext-Fehler, Daten 52e, v1db1",
Wenn das Benutzerkennwort geändert werden muss, enthält es
"8009030C: LdapErr: DSID-0C0904DC, Kommentar: AcceptSecurityContext-Fehler, Daten 773, v1db1"
Der
lexc.ServerErrorMessage
Datenwert ist eine hexadezimale Darstellung des Win32-Fehlercodes. Dies sind dieselben Fehlercodes, die beim sonstigen Aufrufen des Win32 LogonUser-API-Aufrufs zurückgegeben würden. Die folgende Liste fasst eine Reihe allgemeiner Werte mit Hex- und Dezimalwerten zusammen:quelle
System.DirectoryServices
undSystem.DirectoryServices.Protocols
sehr einfache Lösung mit DirectoryServices:
Der NativeObject-Zugriff ist erforderlich, um einen fehlerhaften Benutzer / ein falsches Kennwort zu erkennen
quelle
PrincipleContext
- das nur in .NET 3.5 existiert. Aber wenn Sie .NET 3.5 oder neuer verwenden, sollten Sie verwendenPrincipleContext
Leider gibt es keine "einfache" Möglichkeit, die Anmeldeinformationen eines Benutzers in AD zu überprüfen.
Bei jeder bisher vorgestellten Methode wird möglicherweise ein falsch-negatives Ergebnis angezeigt: Die Creds eines Benutzers sind gültig, AD gibt jedoch unter bestimmten Umständen false zurück:
In ActiveDirectory können Sie mit LDAP nicht feststellen, ob ein Kennwort ungültig ist, weil ein Benutzer das Kennwort ändern muss oder ob sein Kennwort abgelaufen ist.
Um festzustellen, ob das Kennwort geändert wurde oder das Kennwort abgelaufen ist, können Sie Win32: LogonUser () aufrufen und den Windows-Fehlercode auf die folgenden 2 Konstanten überprüfen:
quelle
Der wahrscheinlich einfachste Weg ist PInvoke LogonUser Win32 API.eg
MSDN Referenz hier ...
Ich möchte auf jeden Fall den Anmeldetyp verwenden
Dadurch wird nur ein leichtes Token erstellt - perfekt für AuthN-Prüfungen. (Andere Typen können zum Erstellen interaktiver Sitzungen usw. verwendet werden.)
quelle
LogonUser
API muss der Benutzer das Gesetz als Teil des Betriebssystemprivilegs haben. Dies ist nicht etwas, das Benutzer erhalten - und nicht etwas, das Sie jedem Benutzer in der Organisation gewähren möchten. ( msdn.microsoft.com/en-us/library/aa378184(v=vs.85).aspx )Eine vollständige .NET-Lösung besteht darin, die Klassen aus dem System.DirectoryServices-Namespace zu verwenden. Sie ermöglichen die direkte Abfrage eines AD-Servers. Hier ist ein kleines Beispiel, das dies tun würde:
Dieser Code stellt unter Verwendung der angegebenen Anmeldeinformationen eine direkte Verbindung zum AD-Server her. Wenn die Anmeldeinformationen ungültig sind, löst searcher.FindOne () eine Ausnahme aus. Der ErrorCode entspricht dem COM-Fehler "Ungültiger Benutzername / Passwort".
Sie müssen den Code nicht als AD-Benutzer ausführen. Tatsächlich verwende ich es erfolgreich, um Informationen auf einem AD-Server von einem Client außerhalb der Domäne abzufragen!
quelle
Noch ein .NET-Aufruf zur schnellen Authentifizierung von LDAP-Anmeldeinformationen:
quelle
Versuchen Sie diesen Code (HINWEIS: Berichten zufolge funktioniert er unter Windows Server 2000 nicht)
außer Sie müssen Ihre eigene benutzerdefinierte Ausnahme für "LogonException" erstellen
quelle
Wenn Sie mit .NET 2.0 und verwaltetem Code nicht weiterkommen, können Sie auf folgende Weise mit lokalen und Domänenkonten arbeiten:
quelle
Die Windows-Authentifizierung kann aus verschiedenen Gründen fehlschlagen: einem falschen Benutzernamen oder Kennwort, einem gesperrten Konto, einem abgelaufenen Kennwort und mehr. Um zwischen diesen Fehlern zu unterscheiden, rufen Sie die LogonUser- API-Funktion über P / Invoke auf und überprüfen Sie den Fehlercode, wenn die Funktion Folgendes zurückgibt
false
:Beispielnutzung:
Hinweis: Für LogonUser ist eine Vertrauensbeziehung zu der Domäne erforderlich, für die Sie eine Validierung durchführen.
quelle
Meine einfache Funktion
quelle
Hier meine komplette Authentifizierungslösung als Referenz.
Fügen Sie zunächst die folgenden vier Referenzen hinzu
quelle