java - 使用技术用户的 LDAP 身份验证

标签 java authentication ldap

在我的组织中,我们收到了为新应用程序实现 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/

相关文章:

java - 将文件格式与我的程序关联(Java)

database - 登录显示错误信息

java - Spring LDAP 无法从 AD LDS 读取

php - 获取错误 "Can' t 联系 LDAP 服务器"使用 PHP ldap_bind 函数

java - 调试动态代理创建会改变调用处理程序状态

java - 如何在 Eclipse 中安装 libvirt

java - 输入流与读取器

php - cakephp auth getuser 在 beforefilter

javascript - 身份验证 - 调用 $http 的 .then() 成功回调而不是错误回调

java - 如何通过 LDAP SSL 启用连接池?