在我的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()是抛出错误的地方。 我试过了:
使用确切的DN进行身份验证 例如。 OU = Team1,OU = DepartmentA,DC = RMS,DC = com(只有一个Alex)
删除searchscope的过滤器。
如果您之前遇到此问题,任何人都可以分享一些亮点。感谢
答案 0 :(得分:0)
行为似乎与FindOne()所说的一致:
如果在搜索过程中找到多个条目,则仅返回第一个条目。如果未找到与搜索条件匹配的条目,则返回空引用(在Visual Basic中为Nothing)。
那你怎么知道找到哪个条目? (即你的“Alex的密码是否匹配?)
您需要定义一个策略来处理具有相同cn(RDN)值的两个用户ID。
一般来说,这不是一个好主意。当Alex(1)无法登录时,他可能会要求重置密码。即使他知道他的密码,但他的登录是针对Alex(2)。