Ich möchte eine Reihe von Anmeldeinformationen für den Domänencontroller überprüfen. z.B:
Username: STACKOVERFLOW\joel
Password: splotchy
Methode 1. Active Directory mit Identitätswechsel abfragen
Viele Leute schlagen vor, das Active Directory nach etwas abzufragen. Wenn eine Ausnahme ausgelöst wird, wissen Sie, dass die Anmeldeinformationen ungültig sind - wie in dieser Frage zum Stapelüberlauf vorgeschlagen .
Dieser Ansatz weist jedoch einige schwerwiegende Nachteile auf :
Sie authentifizieren nicht nur ein Domain-Konto, sondern führen auch eine implizite Autorisierungsprüfung durch. Das heißt, Sie lesen Eigenschaften aus dem AD mithilfe eines Identitätswechsel-Tokens. Was ist, wenn das ansonsten gültige Konto keine Leserechte aus dem AD hat? Standardmäßig haben alle Benutzer Lesezugriff, aber Domänenrichtlinien können so eingestellt werden, dass Zugriffsberechtigungen für eingeschränkte Konten (und / oder Gruppen) deaktiviert werden.
Die Bindung an den AD ist mit einem erheblichen Aufwand verbunden. Der AD-Schema-Cache muss auf dem Client geladen werden (ADSI-Cache im ADSI-Anbieter, der von DirectoryServices verwendet wird). Dies ist sowohl netzwerk- als auch AD-Server ressourcenintensiv - und für einen einfachen Vorgang wie die Authentifizierung eines Benutzerkontos zu teuer.
Sie verlassen sich in einem nicht außergewöhnlichen Fall auf einen Ausnahmefehler und gehen davon aus, dass dies einen ungültigen Benutzernamen und ein ungültiges Kennwort bedeutet. Andere Probleme (z. B. Netzwerkfehler, AD-Konnektivitätsfehler, Speicherzuordnungsfehler usw.) werden dann als Authentifizierungsfehler falsch interpretiert.
Methode 2. LogonUser Win32-API
Andere haben vorgeschlagen, die LogonUser()
API-Funktion zu verwenden. Das hört sich gut an, aber leider benötigt der anrufende Benutzer manchmal eine Berechtigung, die normalerweise nur dem Betriebssystem selbst erteilt wird:
Der Prozess, der LogonUser aufruft, erfordert die Berechtigung SE_TCB_NAME. Wenn der aufrufende Prozess nicht über diese Berechtigung verfügt, schlägt LogonUser fehl und GetLastError gibt ERROR_PRIVILEGE_NOT_HELD zurück.
In einigen Fällen muss für den Prozess, der LogonUser aufruft, auch die Berechtigung SE_CHANGE_NOTIFY_NAME aktiviert sein. Andernfalls schlägt LogonUser fehl und GetLastError gibt ERROR_ACCESS_DENIED zurück. Diese Berechtigung ist für das lokale Systemkonto oder die Konten, die Mitglieder der Administratorgruppe sind, nicht erforderlich. Standardmäßig ist SE_CHANGE_NOTIFY_NAME für alle Benutzer aktiviert, einige Administratoren können es jedoch für alle Benutzer deaktivieren.
Das Verteilen des Privilegs " Als Teil des Betriebssystems handeln " möchten Sie nicht ohne weiteres tun - wie Microsoft in einem Knowledge Base-Artikel ausführt :
... der Prozess, der LogonUser aufruft, muss über die Berechtigung SE_TCB_NAME verfügen (im Benutzermanager ist dies das Recht " Als Teil des Betriebssystems handeln "). Das SE_TCB_NAME-Privileg ist sehr leistungsfähig und sollte keinem beliebigen Benutzer gewährt werden, nur damit er eine Anwendung ausführen kann , die Anmeldeinformationen validieren muss.
Darüber hinaus schlägt ein Aufruf von LogonUser()
fehl, wenn ein leeres Kennwort angegeben wird.
Was ist der richtige Weg, um eine Reihe von Domänenanmeldeinformationen zu authentifizieren?
Ich rufe zufällig von verwaltetem Code aus an, aber dies ist eine allgemeine Windows-Frage. Es kann davon ausgegangen werden, dass auf den Kunden .NET Framework 2.0 installiert ist.