0

我是 LDAP API 的新手。我能够连接到 LDAP 服务器并搜索用户。如何使用 LDAP API 对用户名/密码进行身份验证?我没有看到任何身份验证方法DirContext
验证用户是否必须:

  1. 将用户密码作为 SECURITY_CREDENTIALS 传递
  2. 建立 LDAP 连接
  3. 搜索给定的用户名

这是否意味着 LDAP 中的身份验证?

4

2 回答 2

3

当客户端连接到 LDAP 目录服务器时,连接授权状态设置为anonymous。LDAP 客户端使用 BIND 请求来更改连接的授权状态。每个 BIND 请求将连接授权状态更改为anonymous,每个成功的 BIND 请求将连接的授权状态更改为与成功的 BIND 请求关联的授权状态,即用户的授权状态。失败的 BIND 请求使连接处于某种anonymous状态。

客户端构造一个BindRequest(简单的 BIND 请求或一种形式的 SASL 绑定请求)传输到 LDAP 目录服务器并解释来自服务器的响应,包括可能伴随 BIND 响应的任何响应控制。BIND 响应中的结果代码为零表示 LDAP 目录服务器与凭据匹配并且用户已通过身份验证。

如果用户的专有名称已知,则可以从专有名称构造 BIND 请求。如果不知道,LDAP 客户端必须构造一个搜索请求,将其传输到服务器并解释响应。可分辨名称始终包含在返回至少一个条目的成功搜索响应中。然后使用搜索响应中返回的distinct来构造如上的BIND请求。

在最简单的情况下:

// exception handling is not shown
final String dn = ....;
final byte[] password = ....;
final BindRequest bindRequest = new SimpleBindRequest(dn,password);
final LDAPConnection ldapConnection = new LDAPConnection(hostname,port);
final BindResult bindResult = ldapConnection.bind(bindRequest);
final ResultCode resultCode = bindResult.getResultCode();
if(resultCode.equals(ResultCode.SUCCESS))
{
    // user is authenticated
}
ldapConnection.close();

如果您使用 Java,则应使用UnboundID LDAP SDK(JNDI 不应用于新代码)。

也可以看看

于 2012-08-27T18:53:53.733 回答
2

你可以试试 JAAS。为此,JDK 中有com.sun.security.auth.module.LdapLoginModule 。我试过了,效果很好。

于 2012-08-27T17:27:25.277 回答