我已经开始使用UnboundID来实现针对LDAP的身份验证。 我实现了以下身份验证:
连接到LDAP
ldapConnection = new LDAPConnection(host, port, bindUserDN, bindUserPassword);
搜索用户DN:
Filter.create("(sAMAccountName=" + userName + ")");
SearchRequest searchRequest =
new SearchRequest(baseDN, SearchScope.SUB,
DereferencePolicy.NEVER, 0, 0, false, filter,
attributesToReturn);
SearchResult searchResult = ldapConnection.search(searchRequest);`
绑定用户
SimpleBindRequest bindRequest = new SimpleBindRequest(searchResultEntry.getDN(), userPassword);
BindResult bindResult = ldapConnection.bind(bindRequest);
不幸的是,在使用用户DN和用户密码ldapConnection
的最后一次绑定更改为用户DN(而不是绑定用户DN)之后。我使用ldapConnection.getLastBindRequest()
检查了它。
因此,我不能将它用于父条目检索(例如组检索),因为用户没有适当的权限。
ldapConnection
改变用户的预期行为是什么?
如何在用户身份验证后保留LDAP绑定用户连接?
我应该在任何LDAP操作之前(或至少在认证之后)使用bindUserDN重新连接吗?
答案 0 :(得分:2)
预计当您以新用户身份绑定时,您将被绑定为该用户。
我不知道你还能期待什么。
答案 1 :(得分:1)
LDAP客户端使用BIND请求来更改连接的身份验证状态。收到BIND请求时,符合LDAP的服务器必须立即将连接的授权状态设置为“unauthenticated”。如果请求成功,服务器将连接的授权状态设置为与BIND请求中的可分辨名称关联的状态。
答案 2 :(得分:1)
更改连接的标识是LDAP绑定操作的主要影响之一。虽然有些服务器可能提供了一种通过连接对用户进行身份验证而无需更改该连接的身份的方法(例如,UnboundID Directory Server为可以实现此目的的特殊控件提供支持),但我不认为Active Directory提供任何功能。那样的。
如果您使用的服务器未提供任何绑定机制而不更改连接的标识,那么您实际上只有两个选项可以防止绑定永久更改连接的标识:
为绑定使用单独的连接,以便它不会影响您要继续用于其他目的的连接。
执行绑定以验证用户的凭据后,执行第二次绑定以将连接的身份更改回第一次绑定之前的身份。
许多代表最终用户与LDAP目录服务器交互的应用程序使用连接池,连接池可以由多个用户重用,而不是创建单独的连接来处理每个用户。如果您在应用程序中使用连接池,则UnboundID LDAP SDK for Java确实提供了一些功能,可帮助您消除执行绑定对连接标识的影响。 LDAPConnectionPool.bindAndRevertAuthentication方法允许您执行绑定以验证用户的凭据,然后它将自动重新绑定为该连接的原始用户。同样,如果您已从池中检出连接,则可以使用LDAPConnectionPool.releaseAndReAuthenticateConnection方法将连接返回到池中,并使其自动重新绑定为原始用户。
如果您没有使用连接池,而是希望坚持使用单独的连接,那么我建议在第一个绑定之后执行第二次绑定,以将身份验证状态恢复为之前的身份。
答案 3 :(得分:1)
您似乎正在运营需要找到用户的服务,然后让用户“验证”
由于您使用的是UnboundID SDK,我会使用其中一个优秀的LDAPConnectionPool对象,并为“Service”LDAPConnection和用户“Authentication”LDAPConnection使用单独的LDAPConnections。
-Jim