0

我已经开始使用 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 重新连接吗?

4

4 回答 4

2

更改连接的身份是 LDAP 绑定操作的主要影响之一。尽管某些服务器可以提供一种通过连接对用户进行身份验证而不更改该连接的身份的方法(例如,UnboundID Directory Server 提供了对可以完成此操作的特殊控件的支持),但我不认为 Active Directory 提供任何东西像那样。

如果您使用的服务器没有提供任何机制来绑定而不更改连接的身份,那么您实际上只有两个选项可以防止绑定永久更改连接的身份:

  • 为绑定使用单独的连接,这样它就不会影响您要继续用于其他目的的连接。

  • 执行绑定以验证用户的凭据后,执行第二次绑定以将连接的身份更改回第一次绑定之前的身份。

许多代表最终用户与 LDAP 目录服务器交互的应用程序使用连接池,连接池可以由多个用户重复使用,而不是为处理每个用户创建单独的连接。如果您在应用程序中使用连接池,那么 UnboundID LDAP SDK for Java 确实提供了一些功能来帮助您消除执行绑定对连接身份的影响。LDAPConnectionPool.bindAndRevertAuthentication 方法允许您执行绑定以验证用户的凭据,然后它将自动重新绑定为该连接的原始用户。同样,如果您已从池中签出连接,则可以使用 LDAPConnectionPool。

如果您没有使用连接池,而是想坚持使用单个连接,那么我只建议在第一个绑定之后执行第二个绑定,以将身份验证状态恢复为以前的身份。

于 2013-06-27T16:55:32.063 回答
2

预计当您绑定为新用户时,您将绑定为该用户。

我不知道你还能期待什么。

于 2013-06-27T10:41:15.363 回答
1

看来您正在操作一项服务,您需要在其中找到用户,然后让用户“验证”

由于您使用的是 UnboundID SDK,我将使用他们的精细 LDAPConnectionPool 对象之一,并为“服务”LDAPConnection 和用户“身份验证”LDAPConnection 使用单独的 LDAPConnections。

-吉姆

于 2013-06-27T17:18:22.650 回答
1

LDAP 客户端使用 BIND 请求来更改连接的身份验证状态。当接收到 BIND 请求时,符合 LDAP 的服务器必须立即将连接的授权状态设置为“未验证”。如果请求成功,服务器将连接的授权状态设置为与 BIND 请求中的可分辨名称关联的状态。

也可以看看

于 2013-06-27T11:06:14.230 回答