Aktualnie I uwierzytelniać użytkowników przed jakimś AD za pomocą następującego kodu:Active Directory (LDAP) - sprawdź konto zablokowane/hasło wygasło
DirectoryEntry entry = new DirectoryEntry(_path, username, pwd);
try
{
// Bind to the native AdsObject to force authentication.
Object obj = entry.NativeObject;
DirectorySearcher search = new DirectorySearcher(entry) { Filter = "(sAMAccountName=" + username + ")" };
search.PropertiesToLoad.Add("cn");
SearchResult result = search.FindOne();
if (result == null)
{
return false;
}
// Update the new path to the user in the directory
_path = result.Path;
_filterAttribute = (String)result.Properties["cn"][0];
}
catch (Exception ex)
{
throw new Exception("Error authenticating user. " + ex.Message);
}
Działa to doskonale do sprawdzania hasła przed nazwą użytkownika.
Problem polega na tym, że generyczne błędy są zawsze zwracane "Błąd logowania: nieznana nazwa użytkownika lub złe hasło." gdy uwierzytelnianie nie powiedzie się.
Jednak autoryzacja może również zawieść, gdy konto zostanie zablokowane.
Skąd mam wiedzieć, czy nie działa z powodu zablokowania?
Natknąłem artykułów mówiąc można użyć:
Convert.ToBoolean(entry.InvokeGet("IsAccountLocked"))
lub zrobić coś jak wyjaśniono here
jest problem, gdy próby uzyskania dostępu do dowolnej właściwości na DirectoryEntry, ten sam błąd zostałby rzucony.
Jakieś inne sugestie, jak dojść do rzeczywistej przyczyny niepowodzenia uwierzytelnienia? (konto zablokowane/hasło wygasło/itp.)
AD, z którym się łączę, niekoniecznie musi być serwerem Windows.
Dziękuję za to. Znalazłem testowanie na serwerze Windows 2008 AD, który dla wygasłych, ale ważnych haseł, wynik będzie "ERROR_PASSWORD_MUST_CHANGE", ale jeśli hasło wygasło i podane hasło jest nieważne, wynikiem będzie 'ERROR_LOGON_FAILURE'. – Alpha
Zobacz moją odpowiedź (http://stackoverflow.com/a/16796531/1230982), jeśli możesz" t używaj LogonUser i potrzebujesz rozwiązania LDAP –