2

私は Active Directory DirectoryServices.AccountManagementAPI を使用しており、次のコードを使用してサーバーに接続しようとしています:

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, (server + ":" + port), loginUsername, loginPassword);

loginUsername最初に、とloginPasswordが有効で、Active Directory インスタンスに十分な権限があることを確認します。これを実現するために、次のように呼び出します。

bool x = principalContext.ValidateCredentials(null, null);

documentationによると、これはコンストラクターで指定された資格情報を検証するため、null渡されます。デバッガーでは、資格情報が false であることを示す次のエラーがスローされます。

ここに画像の説明を入力

ただし、ValidateCredentials チェックの実際の結果は奇妙なことに十分に返さtrueれるため、コードは引き続き実行されます。

これはどのように解決できますか?

編集:

エラーについて詳しく説明している別のスクリーンショットを次に示します。スクリーンショットに示されているように、私はメソッドを呼び出し、ユーザー名とパスワードの値をValidateCredentials渡しています。ドキュメントによると、これは PrincipalContext クラスのコンストラクターで渡された資格情報の検証を試みます。null

スクリーンショットは、渡されたユーザー名とパスワードがどちらも「test」であり、無効で Active Directory に存在しないことも示しています。多数のエラーが表示されているにもかかわらず、メソッドは true を返しています。

ここに画像の説明を入力

4

1 に答える 1

0

null値の検索をやめるだけです...

if (string.IsNullOrEmpty(password) || string.IsNullOrEmpty(username)) return false;

いくつかのテストを実行しました

    using (var pc = new PrincipalContext(ContextType.Domain, "mydomain.lan")){

    var isOk1 = pc.ValidateCredentials(null,null); //Always true
    var isOk2 = pc.ValidateCredentials("notexists","wrong"); //false
    var isOk2 = pc.ValidateCredentials("existing","correct"); //true
    }

    using (var pc = new PrincipalContext(ContextType.Domain, "mydomain.lan", "notright","wrong")){
        var isOk1 = pc.ValidateCredentials(null,null); //Always true
        var isOk2 = pc.ValidateCredentials("notexists","wrong"); //false
        var isOk2 = pc.ValidateCredentials("existing","correct"); //true
}

そのため、ValidateCredentials は実際にはコンテキストでユーザーを必要としません...ただし、false を指定すると、ユーザー グループなどの次のルックアップは失敗します。

はい、ドキュメントは次のとおりです。

ValidateCredentials メソッドは、コンストラクターで指定されたサーバーにバインドします。ユーザー名とパスワードのパラメーターが null の場合、コンストラクターで指定された資格情報が検証されます。コンストラクターで資格情報が指定されておらず、ユーザー名とパスワードのパラメーターが null の場合、このメソッドは現在のプリンシパルの既定の資格情報を検証します。
( http://msdn.microsoft.com/en-us/library/bb154889%28v=vs.100%29.aspx )

しかし、コンストラクターの信用が機能していることを確認できません

編集:あなたはすでに受け入れていますが、この方法を問題に使用できますか?

 using (var pc = new PrincipalContext(ContextType.Domain, "domain.lan", username, password))
            {
                if (pc.ValidateCredentials(username, password))
                {
                    try
                    {
                        using (var searcher = new PrincipalSearcher(new UserPrincipal(pc)))
                        {
                            searcher.QueryFilter.SamAccountName = username;
                            Principal u = searcher.FindOne();
                        }
                    }
                    catch (Exception)
                    {
                        return "no rights to work on ad";
                    }
                }
                else
                {
                    return "user cannot login";
                }
            }
于 2013-11-12T10:58:06.813 に答える