1

MicrosoftのADAMステップバイステップガイドに従い、ローカルマシンにADAMインスタンスをセットアップしました。「MaryBaker」アカウントを使用して認証しようとしていますが、次のif (entry.Guid != null)行でCOM例外が発生するたびに発生します。例外は、不明なユーザー名または不正なパスワードがあることを示しています。

ただし、ldpユーティリティを使用してADAMに接続し、単純なバインドを正常に実行できます。したがって、ユーザー名が両方とも存在し、正しいパスワードを持っていることがわかります。

さらに、ユーザーのmsDS-UserAccountDisabledプロパティをfalseに設定し、ユーザーをAdministratorsロールとReadersロールの両方に追加しました。

何かご意見は?

    path = "LDAP://localhost:50000/O=Microsoft,c=US";
    userId = "CN=Mary Baker,OU=ADAM users,";
    password = "Mary@101";

    DirectoryEntry entry = new DirectoryEntry(path, userId, password, AuthenticationTypes.None);
    if (entry.Guid != null)
        LoadWelcomeScreen();

ありがとう。

4

3 に答える 3

2

ADAM は、ユーザーの一意の識別子をクラスのdisplayName属性に格納します。userユーザーが認証するには、ADAM インスタンス内で一意である必要があります。2 人のユーザーのdisplayName属性が両方とも「jsmith」に設定されている場合、どちらのユーザーも ADAM で認証できませんでした。

ldp ユーティリティを使用してdisplayName、Mary Baker を照会します。「mbaker」のようなものかもしれません。その値を、指定されたコードで userId として使用します。

于 2011-06-09T03:06:44.863 に答える
1

displayNameに関するヒントをありがとう Ryan 。興味のある人のために、ローカルの ADAM インスタンスにテスト クラスを投稿しました。

    [TestMethod]
    public void CreateUserAccount()
    {
        var username = "amurray";
        var password = "ADAMComplexPassword1234";
        var firstname = "Andy";
        var lastname = "Murray";

        const AuthenticationTypes authTypes = AuthenticationTypes.Signing |
                                              AuthenticationTypes.Sealing |
                                              AuthenticationTypes.Secure;

        var ldapPath = "LDAP://localhost:389/OU=MyProject,OU=Applications,DC=Company,DC=ADAM";
        using (var dirEntry = new DirectoryEntry(ldapPath, "MyPC\\adamuser", "Password1!", authTypes))
        {
            DirectoryEntry user = null;
            const int ADS_PORT = 389;
            const long ADS_OPTION_PASSWORD_PORTNUMBER = 6;
            const long ADS_OPTION_PASSWORD_METHOD = 7;
            const int ADS_PASSWORD_ENCODE_CLEAR = 1;

            try
            {
                user = dirEntry.Children.Add(string.Format("CN={0} {1}", firstname, lastname), "user");
                user.Properties["displayName"].Value = username;
                user.Properties["userPrincipalName"].Value = username;
                user.Properties["msDS-UserAccountDisabled"].Value = false;
                user.Properties["msDS-UserDontExpirePassword"].Value = true;
                user.CommitChanges();
                var userid = user.Guid.ToString();

                // Set port number, method, and password.
                user.Invoke("SetOption", new object[]{ADS_OPTION_PASSWORD_PORTNUMBER,ADS_PORT});
                user.Invoke("SetOption", new object[]{ADS_OPTION_PASSWORD_METHOD,ADS_PASSWORD_ENCODE_CLEAR});

                user.Invoke("SetPassword", new object[] {password});
                user.CommitChanges();
                user.Close();
            }
            catch (Exception e)
            {
                var msg = e.GetBaseException().Message;
                Console.WriteLine(e);
                System.Diagnostics.Debug.Print(msg);
            }                
        }
    }


    [TestMethod]
    public void TestUserAuthentication()
    {
        try
        {
            var ldsContext = new PrincipalContext(ContextType.ApplicationDirectory, "localhost:389",
                                                  "OU=MyProject,OU=Applications,DC=Company,DC=ADAM",
                                                  ContextOptions.SimpleBind);

            // Returns true if login details are valid
            var isValid = ldsContext.ValidateCredentials("amurray", "ADAMComplexPassword1234", ContextOptions.SimpleBind);
        }
        catch (Exception e)
        {
            var msg = e.GetBaseException().Message;
            Console.WriteLine(e);
            System.Diagnostics.Debug.Print(msg);
        }
    }
于 2013-05-09T15:35:17.970 に答える
0

ADAM や System.DirectoryServices は使用したことがありませんが、LDAP と AD の使用経験はあります。うまくいけば、以下が適用されます。

その形式で与えられたユーザー ID を見たことがありません。(末尾のコンマで示されているように、ある種の相対 DN のように見えますか?) ユーザー ID を完全な DN (標準の LDAP で必要) または生のユーザー名 (ADAM がサポートしている場合) として指定しようとしましたか?

このようなネットワーク プロトコルの問題を診断するとき (自分のプログラムが自分が指示したとおりに動作しているかどうかを確認し、機能しているプログラムと比較してどのように動作しているかを確認する)、Wiresharkを実行すると役立つことがわかりました。機能していない操作と機能している操作の両方について、それらがどのように異なるかを確認します。Wireshark を使用したことがない場合でも、開始するのはそれほど難しくないことを願っています。

  1. ソフトウェアをダウンロードしてインストールし、起動します。
  2. [キャプチャ] で、[オプション] をクリックします。
  3. インターフェイスを localhost / loopback またはイーサネット インターフェイスに設定します。(ループバックが Windows で期待どおりに機能するとは思いません。おそらく、イーサネット インターフェイスを選択し、C# コードで LDAP URL を更新して、localhost ではなくホスト名を使用することをお勧めします。)
  4. [キャプチャ フィルター] の下に、「tcp ポート 50000」(引用符なし) と入力します。
  5. [開始] をクリックして接続操作を実行し、[キャプチャ] メニューに移動して [停止] をクリックします。

Wireshark はプロトコルを分析できるため、自分でプロトコルの詳細に精通している必要はありませんが、知識があればあるほど、すべての詳細を簡単に解釈できますWireshark のいくつかのインスタンスを起動して、2 つの異なるキャプチャ (コードと LDP) を簡単に比較できます。

于 2008-11-20T03:29:31.613 に答える