LDAP在不同的OU中创建具有相同用户名的两个用户

时间:2018-05-22 03:53:31

标签: c# ldap

在我的AD中,在创建了两个具有相同用户名的用户后,我无法登录 - Alex在不同的OU中。他们有不同的sAMAccountName。

错误:

  

调用方法 - auehtnticateUser。   System.DirectoryServices.DirectoryServicesCOMException(0x8007052E):   用户名或密码不正确。

     

at System.DirectoryServices.DirectoryEntry.Bind(Boolean   throwIfFail)在System.DirectoryServices.DirectoryEntry.Bind()中   在System.DirectoryServices.DirectoryEntry.get_AdsObject()at   System.DirectoryServices.DirectorySearcher.FindOne()at   LDAP_TestApp.LDAPConnection.AuthenticateUser(String ldapPath,String   dn,String userName,String pwd,Boolean isAuthenticated)

但是,似乎可以在不同的OU中使用相同的用户名 基于此链接Unique name requirement in AD我的用户拥有唯一的DN。

一旦我删除了任何OU中的一个用户,问题就消失了。

我的代码如下:

public string AuthenticateUser(string ldapPath, string dn, string
userName, string pwd, bool isAuthenticated)
    {
            string entryPath = (dn.Trim() == string.Empty) ? ldapPath : entryPath = ldapPath + '/' + dn;

            StringBuilder sb = new StringBuilder();
            AuthenticationTypes checkState;
            DirectoryEntry searchRoot;
            if (isAuthenticated)
            {
                checkState = AuthenticationTypes.Secure;
                searchRoot = new DirectoryEntry(entryPath, userName, pwd, checkState);
            }
            else
            {
                checkState = AuthenticationTypes.None;
                searchRoot = new DirectoryEntry(entryPath, "", "", checkState);
            }

            // Here starts the query
            DirectorySearcher search = new DirectorySearcher(searchRoot)
            {
                SearchScope = System.DirectoryServices.SearchScope.Subtree,
                Filter = "(&" +
                    "(objectClass=person)" +
                    "(cn=" + userName + ")" + 
                ")"
            };
            search.PropertiesToLoad.Add("dn");
            search.PropertiesToLoad.Add("cn");
            search.PropertiesToLoad.Add("distinguishedname");
            SearchResult result = search.FindOne();
           //the rest is how the result being handled.

行search.FindOne()是抛出错误的地方。 我试过了:

  1. 使用确切的DN进行身份验证 例如。 OU = Team1,OU = DepartmentA,DC = RMS,DC = com(只有一个Alex)

  2. 删除searchscope的过滤器。

  3. 如果您之前遇到此问题,任何人都可以分享一些亮点。感谢

1 个答案:

答案 0 :(得分:0)

行为似乎与FindOne()所说的一致:

如果在搜索过程中找到多个条目,则仅返回第一个条目。如果未找到与搜索条件匹配的条目,则返回空引用(在Visual Basic中为Nothing)。

那你怎么知道找到哪个条目? (即你的“Alex的密码是否匹配?)

您需要定义一个策略来处理具有相同cn(RDN)值的两个用户ID。

一般来说,这不是一个好主意。当Alex(1)无法登录时,他可能会要求重置密码。即使他知道他的密码,但他的登录是针对Alex(2)。