Active Directory (LDAP) - Conta de cheque bloqueada / Senha expirada
Atualmente eu autentico usuários contra algum AD usando o seguinte código:
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);
}
Isso funciona perfeitamente para validar uma senha contra um nome de usuário.
O problema é que um erro genérico sempre é retornado "Falha de logon: nome de usuário desconhecido ou senha incorreta". quando a autenticação falhar.
No entanto, a autenticação também pode falhar quando uma conta é bloqueada.
Como eu saberia se está falhando por causa disso ser bloqueado?
Eu me deparei com artigos dizendo que você pode usar:
Convert.ToBoolean(entry.InvokeGet("IsAccountLocked"))
ou fazer algo como explicadoAqui
O problema é que, sempre que você tentar acessar qualquer propriedade no DirectoryEntry, o mesmo erro será lançado.
Alguma outra sugestão de como chegar ao motivo real de que a autenticação falhou? (conta bloqueada / senha expirada / etc)
O AD ao qual me conecto pode não ser necessariamente um servidor Windows.