Chcę zweryfikować zestaw poświadczeń względem kontrolera domeny. na przykład:
Username: STACKOVERFLOW\joel
Password: splotchy
Metoda 1. Zapytanie do usługi Active Directory z personifikacją
Wiele osób sugeruje wyszukanie czegoś w usłudze Active Directory. Jeśli zostanie zgłoszony wyjątek, to wiesz, że poświadczenia są nieprawidłowe - jak sugeruje to pytanie o przepływie stosu .
Takie podejście ma jednak kilka poważnych wad :
Nie tylko uwierzytelniasz konto domeny, ale również przeprowadzasz niejawną kontrolę autoryzacji. Oznacza to, że odczytujesz właściwości z usługi AD przy użyciu tokenu personifikacji. Co się stanie, jeśli konto, które w przeciwnym razie działa, nie ma uprawnień do odczytu z reklamy? Domyślnie wszyscy użytkownicy mają dostęp do odczytu, ale zasady domeny można ustawić tak, aby wyłączyć uprawnienia dostępu dla kont z ograniczeniami (i / lub grup).
Powiązanie z usługą AD wiąże się z poważnymi narzutami, pamięć podręczna schematu usługi AD musi zostać załadowana po stronie klienta (pamięć podręczna ADSI u dostawcy ADSI używana przez DirectoryServices). Jest to zarówno sieć, jak i serwer AD, które pochłaniają zasoby - i są zbyt kosztowne dla prostej operacji, takiej jak uwierzytelnianie konta użytkownika.
Polegasz na niepowodzeniu wyjątku w przypadku nietypowym i zakładasz, że oznacza to nieprawidłową nazwę użytkownika i hasło. Inne problemy (np. Awaria sieci, awaria łączności AD, błąd alokacji pamięci itp.) Są następnie błędnie interpretowane jako awaria uwierzytelniania.
Metoda 2. LogonUser Win32 API
Inni sugerowali użycie LogonUser()
funkcji API. Brzmi to nieźle, ale niestety użytkownik wywołujący czasami potrzebuje pozwolenia, które zwykle jest udzielane tylko samemu systemowi operacyjnemu:
Proces wywołujący LogonUser wymaga uprawnienia SE_TCB_NAME. Jeśli proces wywołujący nie ma tego uprawnienia, LogonUser kończy się niepowodzeniem i GetLastError zwraca ERROR_PRIVILEGE_NOT_HELD.
W niektórych przypadkach proces, który wywołuje LogonUser, musi mieć również włączone uprawnienie SE_CHANGE_NOTIFY_NAME; w przeciwnym razie LogonUser nie powiedzie się i GetLastError zwraca ERROR_ACCESS_DENIED. To uprawnienie nie jest wymagane w przypadku lokalnego konta systemowego ani kont należących do grupy administratorów. Domyślnie SE_CHANGE_NOTIFY_NAME jest włączony dla wszystkich użytkowników, ale niektórzy administratorzy mogą go wyłączyć dla wszystkich.
Udostępnianie uprawnienia „ Działaj jako część systemu operacyjnego ” nie jest czymś, co chcesz robić, kiedy nie chcesz - jak wskazuje Microsoft w artykule z bazy wiedzy :
... proces, który wywołuje LogonUser, musi mieć uprawnienie SE_TCB_NAME (w Menedżerze użytkowników jest to uprawnienie „ Działaj jako część systemu operacyjnego ”). Przywilej SE_TCB_NAME ma bardzo duże możliwości i nie powinien być nadawany żadnemu dowolnemu użytkownikowi tylko po to, aby mógł on uruchomić aplikację wymagającą weryfikacji poświadczeń.
Ponadto wywołanie LogonUser()
nie powiedzie się, jeśli zostanie określone puste hasło.
Jaki jest właściwy sposób uwierzytelniania zestawu poświadczeń domeny?
Tak się składa, że dzwonię z kodu zarządzanego, ale jest to ogólne pytanie dotyczące systemu Windows. Można założyć, że klienci mają zainstalowany .NET Framework 2.0.