NativeObject try-catch 无法捕获超时错误

问题描述 投票:0回答:1

在下面的代码中,

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 没有捕获超时错误有什么原因吗?

c# wpf active-directory try-catch
1个回答
0
投票

这是我从这里发现的:

针对 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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.