Ответ 1
У вопроса уже есть ответ Почему Active Directory проверяет последний пароль?
Решение заключается в использовании аутентификации Kerberos.
В следующем коде показано, как можно выполнить проверку достоверности с использованием только Kerberos. Метод аутентификации при использовании не будет возвращаться к NTLM в случае сбоя.
private const int ERROR_LOGON_FAILURE = 0x31;
private bool ValidateCredentials(string username, string password, string domain)
{
NetworkCredential credentials
= new NetworkCredential(username, password, domain);
LdapDirectoryIdentifier id = new LdapDirectoryIdentifier(domain);
using(LdapConnection connection = new LdapConnection(id, credentials, AuthType.Kerberos))
{
connection.SessionOptions.Sealing = true;
connection.SessionOptions.Signing = true;
try
{
connection.Bind();
}
catch (LdapException lEx)
{
if (ERROR_LOGON_FAILURE == lEx.ErrorCode)
{
return false;
}
throw;
}
return true;
}