ADAM身份验证与ADAM用户和简单绑定

时间:2008-11-19 22:27:45

标签: c# authentication active-directory adam

我遵循了Microsoft的ADAM Step by Step Guide,并在我的本地计算机上设置了ADAM实例。我正在尝试使用“Mary Baker”帐户进行身份验证,但每次我在下面的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 个答案:

答案 0 :(得分:2)

ADAM将用户的唯一标识符存储在displayName类的user属性中。它们需要在ADAM实例中是唯一的,以供用户进行身份验证。如果两个用户的displayName属性都设置为'jsmith',则两个用户都无法在ADAM中进行身份验证。

使用ldp实用程序查询Mary Baker的displayName。它可能像'mbaker'。在给定代码中将该值用作userId。

答案 1 :(得分:1)

感谢Ryan对 displayName 的提示。将我的测试课程发布在我当地的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);
        }
    }

答案 2 :(得分:0)

我的名字是ADAM,我不同意这种身份验证。

(哈哈,对不起,不得不这样做)

答案 3 :(得分: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 port 50000”(无引号)。
  5. 单击“开始”,运行连接操作,然后进入“捕获”菜单并单击“停止”。
  6. Wireshark可以为您分析协议,因此您不必非常熟悉协议详细信息,尽管您知道的越多,解释所有细节就越容易。你可以启动一些Wireshark实例来轻松比较两种不同的捕获(你的代码和LDP)。