在我的组织中,我们收到了为新应用程序实现 LDAP 身份验证的请求。我们面临的问题是用于连接 Activity 目录的 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,但这并没有改变任何东西。
最佳答案
Active Directory 可以使用域和用户 sAMAccountName 或 userPrincipalName 值对用户进行身份验证。如果您在单个林中有一棵树,则名为“domain.ccTLD”(旧名称“domain”)的域中的用户名“sampleuser”可以作为“domain\sampleuser”或“sampleuser@domain.com”进行身份验证 - 无需找出实际的专有名称。
但是对于您正在使用的流程,这就是我用于 AD 和纯 LDAP 服务器(OpenLDAP、Oracle Unified Directory 等)的 LDAP 身份验证的流程:
- 连接到 LDAP 服务器 与服务帐户绑定(bind)
- 使用“(&(sAMAccountName=...))”过滤器搜索用户
- 检索完全限定的 DN(distinguishedName 属性值或返回的 对象 DN)
- 断开与 LDAP 服务器的连接。
- 连接到 LDAP 服务器
- 使用检索到的完全限定 DN 和用户提供的密码进行绑定(bind)
- (可选:如果您也执行授权,请根据需要验证群组成员身份)
- 断开与 LDAP 服务器的连接
通过将系统帐户登录和搜索与用户登录和搜索分开,我从未见过系统帐户被错误锁定。
关于java - 使用技术用户的 LDAP 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52513698/