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

これは、DirectoryEntryADSI を使用しているという事実に関連しています。BasePathADSI には、Usernameおよびに基づいて構築された内部 LDAP 接続プールがありPasswordます。

アカウントがロックアウトされる前に正しいパスワードでバインドしようとした場合、その正しいパスワードを使用して 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 に答える