1

当提供错误密码的次数足以触发锁定时,我正在测试 .net LDAP 客户端的行为。

我看到了这种奇怪的行为:似乎如果进程在任何时候成功连接,那么即使在故意触发锁定之后它也能够重新连接。

这是我的绑定方法的简写版本:

private DirectoryEntry Bind(string userId, string password)
{
    var entry = new DirectoryEntry(BasePath, userId, password);
    // If the password is bad, the attempt to access entry.NativeObject throws an exception. 
    var obj = entry.NativeObject;  // causes the bind to occur
    return entry;
}

我的测试进行如下:

private void TestLockout()
{
    // attempt with bad pw enough times to trigger a lockout.
    for (int i=0; i < 5; i++)
    {
        try
        {
            // i.ToString() is a purposefully bad pw
            Bind("testuser", i.ToString());
        }
        catch
        {
        }
    }
    // Now make sure that an attempt with a good pw fails due to lockout
    var bindSuccess = true;
    try
    {
        Bind("testuser", "correctpassword");
    }
    catch
    {
        bindSuccess = false;  
    }
    // the output should be "false"
    Console.WriteLine("Bind result is " + bindSuccess.ToString();
}

这工作正常。但是,如果在测试之前使用正确的密码调用 Bind(),我会得到不同的结果。

爱荷华,这个:

Bind("testuser", "correctpassword");  // succeeds
TestLockout(); // does not give the correct result

发生以下情况。

a) TestLockout 产生不正确的输出,因为最终的 Bind 成功并且它不应该成功。
b) 然而,我知道该用户被锁定,因为随后的检查。

因此,似乎某些组件正在跟踪当前进程是否已成功连接。我需要有办法清除这种情况。此身份验证代码将在长时间运行的服务进程中执行,并且在用户真正被锁定时对其进行身份验证是不可接受的。

4

1 回答 1

1

DirectoryEntry这与使用 ADSI的事实有关。ADSI 具有基于 和 构建的内部 LDAPBasePath连接UsernamePassword

如果您在帐户被锁定之前尝试使用正确的密码进行绑定,则使用该正确密码成功建立了 LDAP 连接并缓存在连接池中。然后,您将帐户锁定并尝试使用相同的BasePathUsername绑定到 Active Directory PasswordDirectoryEntry此时不会建立新的 LDAP 连接而是重用之前的连接。您可以通过查看网络跟踪来证明这一点。

要修复它,您可以DirectoryEntry在不需要时丢弃它。处理完DirectoryEntry之后,ADSI 应该足够聪明,可以关闭它不再需要的 LDAP 连接。在您的示例代码中,您似乎再也不需要它了。因此,这应该可以解决问题。

private void Bind(string userId, string password)
{
    using (var entry = new DirectoryEntry(BasePath, userId, password))
    {
        // If the password is bad, the attempt to access entry.NativeObject throws an exception. 
        var obj = entry.NativeObject;  // causes the bind to occur
    }
}
于 2012-07-17T15:44:08.083 回答