使用技术用户的LDAP认证

时间:2018-09-26 08:53:36

标签: java authentication ldap

在我的组织中,我们有一个要求为新应用程序实施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,但这并没有改变任何内容。

1 个答案:

答案 0 :(得分:0)

Active Directory可以使用域和用户sAMAccountName或userPrincipalName值对用户进行身份验证。如果您在单个林中只有一棵树,则在名为“ domain.ccTLD”(旧名称“ domain”)的域中的用户名“ sampleuser”可以通过“ domain \ sampleuser”或“ sampleuser@domain.com”进行身份验证-无需弄清楚实际的专有名称。

但是对于您正在使用的流程,这就是我用于AD和纯LDAP服务器(OpenLDAP,Oracle Unified Directory等)的LDAP身份验证的方式:

  • 连接到LDAP服务器与服务帐户绑定
  • 使用“(&(sAMAccountName = ...))”过滤器搜索用户
  • 检索完全限定的DN(distinguishedName属性值或返回 对象DN)
  • 断开与LDAP服务器的连接。
  • 连接到LDAP服务器
  • 使用检索到的标准DN和用户提供的密码进行绑定
  • (可选:如果您也正在执行授权,请根据需要验证组成员身份)
  • 断开与LDAP服务器的连接

通过将系统帐户登录和搜索与用户登录并搜索分开,我从未见过系统帐户被错误锁定。