在下面的代码中,
private bool AuthenticateUser(string userName, string password)
{
try
{
using(var entry = new DirectoryEntry("myLDAP", userName, password))
{
// Attempt to bind to the directory entry
object nativeObject = entry.NativeObject;
return true; // Authentication succeeded
}
}
catch(DirectoryServicesCOMException)
{
// Handle exception for failed authentication
return false;
}
catch(Exception ex)
{
// Handle other exceptions (logging, etc.)
MessageBoxes.msgBoxOK(
"Authentication Error",
$"An error occurred: {ex.Message}",
MessageBoxImage.Error);
return false;
}
}
我得到了,
“System.DirectoryServices.DirectyEntry.NativeObject.get”超时,需要以不安全的方式中止。这可能损坏了目标进程。
但是对于 catch(DirectoryServicesCOMException) 或一般的 catch(Exception ex) 都不会捕获该错误
相反,代码在块中继续并返回 true。
try-catch 没有捕获超时错误有什么原因吗?
这是我从这里发现的:
针对 AD 的绑定会产生严重的开销,必须在客户端加载 AD 架构缓存(DirectoryServices 使用的 ADSI 提供程序中的 ADSI 缓存)。这既消耗网络,又消耗 AD 服务器资源,而且对于验证用户帐户之类的简单操作来说成本太高。
虽然它没有解释为什么 try-catch 没有捕获错误的行为,但它确实向我指出了一个使用 PrimaryContext 的可行解决方案。
这可以正常工作,没有任何延迟或错误:
private bool AuthenticateUser(string userName, string password)
{
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "EnterYourDomain"))
{
return context.ValidateCredentials(userName, password);
}
}