Jak mogę zweryfikować nazwę użytkownika i hasło do Active Directory? Chcę po prostu sprawdzić, czy nazwa użytkownika i hasło są prawidłowe.
526
Jak mogę zweryfikować nazwę użytkownika i hasło do Active Directory? Chcę po prostu sprawdzić, czy nazwa użytkownika i hasło są prawidłowe.
Jeśli pracujesz na .NET 3.5 lub nowszym, możesz użyć System.DirectoryServices.AccountManagement
przestrzeni nazw i łatwo zweryfikować swoje poświadczenia:
// 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");
}
To proste, niezawodne, to kod zarządzany w 100% C # po twojej stronie - o co więcej można prosić? :-)
Przeczytaj o tym tutaj:
Aktualizacja:
Jak opisano w tym drugim pytaniu SO (i jego odpowiedziach) , istnieje problem z tym wywołaniem, które prawdopodobnie powraca w True
przypadku starych haseł użytkownika. Bądź świadomy tego zachowania i nie zdziw się, jeśli tak się stanie :-) (dzięki @MikeGledhill za zwrócenie na to uwagi!)
UserPrinciple.FindByIdentity
aby sprawdzić, czy przekazany identyfikator użytkownika istnieje wcześniej.ContextOptions.Negotiate
.Robimy to w naszym intranecie
Musisz użyć System.DirectoryServices;
Oto wnętrzności kodu
źródło
strPassword
jest przechowywany w LDAP jako zwykły tekst?Close()
nausing
zmiennej.W kilku przedstawionych tutaj rozwiązaniach brakuje możliwości rozróżnienia niewłaściwego użytkownika / hasła od hasła, które należy zmienić. Można to zrobić w następujący sposób:
Jeśli hasło użytkownika jest nieprawidłowe lub użytkownik nie istnieje, błąd będzie zawierał
„8009030C: LdapErr: DSID-0C0904DC, komentarz: błąd AcceptSecurityContext, dane 52e, v1db1”,
jeśli hasło użytkownika wymaga zmiany, będzie ono zawierać
„8009030C: LdapErr: DSID-0C0904DC, komentarz: błąd AcceptSecurityContext, dane 773, v1db1”
Wartość
lexc.ServerErrorMessage
danych stanowi szesnastkową reprezentację kodu błędu Win32. Są to te same kody błędów, które zostałyby zwrócone przez wywołanie wywołania API Win32 LogonUser. Poniższa lista podsumowuje zakres wspólnych wartości z wartościami szesnastkowymi i dziesiętnymi:źródło
System.DirectoryServices
orazSystem.DirectoryServices.Protocols
bardzo proste rozwiązanie za pomocą DirectoryServices:
Dostęp NativeObject jest wymagany do wykrycia złego użytkownika / hasła
źródło
PrincipleContext
- który istnieje tylko w .NET 3.5. Ale jeśli używasz .NET 3.5 lub nowszej, powinieneś użyćPrincipleContext
Niestety nie ma „prostego” sposobu sprawdzenia poświadczeń użytkowników w AD.
Przy każdej przedstawionej dotychczas metodzie możesz otrzymać wynik fałszywie ujemny: poświadczenia użytkownika będą ważne, jednak AD zwróci fałsz w pewnych okolicznościach:
ActiveDirectory nie pozwoli ci użyć LDAP do ustalenia, czy hasło jest nieprawidłowe, ponieważ użytkownik musi zmienić hasło lub jego hasło wygasło.
Aby ustalić zmianę hasła lub hasło wygasło, możesz wywołać Win32: LogonUser () i sprawdzić kod błędu systemu Windows pod kątem następujących 2 stałych:
źródło
Prawdopodobnie najłatwiejszym sposobem jest PInvoke LogonUser Win32 API.eg
Dokumentacja MSDN tutaj ...
Zdecydowanie chcę użyć typu logowania
Tworzy to tylko lekki token - idealny do czeków AuthN. (inne typy mogą być używane do tworzenia interaktywnych sesji itp.)
źródło
LogonUser
API wymaga, aby użytkownik miał do działania jako część systemu operacyjnego privelage; co nie jest czymś, co użytkownicy otrzymują - i czymś, czego nie chcesz przyznawać każdemu użytkownikowi w organizacji. ( msdn.microsoft.com/en-us/library/aa378184(v=vs.85).aspx )Pełnym rozwiązaniem .Net jest użycie klas z przestrzeni nazw System.DirectoryServices. Pozwalają na bezpośrednie zapytanie do serwera AD. Oto mała próbka, która by to zrobiła:
Ten kod łączy się bezpośrednio z serwerem AD przy użyciu podanych poświadczeń. Jeśli dane uwierzytelniające są niepoprawne, seekcher.FindOne () zgłosi wyjątek. ErrorCode to kod odpowiadający błędowi COM „nieprawidłowa nazwa użytkownika / hasło”.
Nie musisz uruchamiać kodu jako użytkownik AD. W rzeczywistości z powodzeniem używam go do wyszukiwania informacji na serwerze AD od klienta spoza domeny!
źródło
Jeszcze jedno wywołanie platformy .NET w celu szybkiego uwierzytelnienia poświadczeń LDAP:
źródło
Wypróbuj ten kod (UWAGA: Zgłoszono, że nie działa w systemie Windows Server 2000)
z wyjątkiem tego, że musisz utworzyć własny niestandardowy wyjątek dla „LogonException”
źródło
Jeśli utkniesz w .NET 2.0 i kodzie zarządzanym, oto inny sposób, który działa z kontami lokalnymi i domenowymi:
źródło
Uwierzytelnianie systemu Windows może się nie powieść z różnych powodów: niepoprawnej nazwy użytkownika lub hasła, zablokowanego konta, wygasłego hasła i innych. Aby rozróżnić te błędy, wywołaj funkcję LogonUser API za pomocą P / Invoke i sprawdź kod błędu, jeśli funkcja zwraca
false
:Przykładowe użycie:
Uwaga: LogonUser wymaga relacji zaufania z domeną, dla której sprawdzasz poprawność.
źródło
Moja prosta funkcja
źródło
Oto moje kompletne rozwiązanie uwierzytelniające w celach informacyjnych.
Najpierw dodaj cztery następujące odniesienia
źródło