在我的组织中,我们有一个要求为新应用程序实施LDAP身份验证的请求。我们面临的问题是用于连接到活动目录的CN与sAMAccountName不同。
sAMAccountName是组织为用户提供的用户名,而cn类似于lastName, firstName [Intern]
。
为解决此问题,我们决定使用技术用户从sAMAccountName检索cn,然后尝试使用cn和密码对用户进行身份验证,代码如下:
InitialDirContext initialDirContext = new InitialDirContext(initUserAuthenticationInfo(technicalUserCredentilas.Username, technicalUserCredentilas.Password))
searchResult =initialDirContext.search(AuthenticationHelper.DEFAULT_SEARCH_BASE, "(&(sAMAccountName=" + username + "))", searchCriteria)
userCNFromAD = searchResult.hasMore() ? "CN=" + (searchResult.nextElement().getAttributes().get("cn").get())
问题是,每当用户尝试登录失败时,Active Directory就会将其视为技术用户尝试登录失败!然后一段时间后,技术用户总是被锁定 在使用initialDirContext.close()获取用户cn之后,我尝试关闭initialDirContext,但这并没有改变任何内容。
答案 0 :(得分:0)
Active Directory可以使用域和用户sAMAccountName或userPrincipalName值对用户进行身份验证。如果您在单个林中只有一棵树,则在名为“ domain.ccTLD”(旧名称“ domain”)的域中的用户名“ sampleuser”可以通过“ domain \ sampleuser”或“ sampleuser@domain.com”进行身份验证-无需弄清楚实际的专有名称。
但是对于您正在使用的流程,这就是我用于AD和纯LDAP服务器(OpenLDAP,Oracle Unified Directory等)的LDAP身份验证的方式:
通过将系统帐户登录和搜索与用户登录并搜索分开,我从未见过系统帐户被错误锁定。