使用技术用户的 LDAP 身份验证
LDAP Authentication using a technical user
在我的组织中,我们请求为新应用程序实施 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 但这并没有改变任何东西。
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 服务器的连接
通过将系统帐户登录和搜索与用户登录和搜索分开,我从未见过系统帐户被错误锁定。
在我的组织中,我们请求为新应用程序实施 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 但这并没有改变任何东西。
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 服务器的连接
通过将系统帐户登录和搜索与用户登录和搜索分开,我从未见过系统帐户被错误锁定。