【问题标题】:How to Authenticate a user from a LDAP directory with his username and password?如何使用用户名和密码从 LDAP 目录验证用户?
【发布时间】:2012-08-22 05:05:00
【问题描述】:

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

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

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

【问题讨论】:

  • 这个 LDAP 服务器是 windows 域控制器吗?
  • 不确定,因为它是客户的广告。有关系吗?
  • 我怀疑是否将 Windows AD 配置为基于用户/密码的简单身份验证。它主要配置为在企业/生产环境中与 NTLMv1 或 NTLMv2(自 windows 2007 起)或 SPNEGO 通信。
  • 假设它已配置为进行身份验证。

标签: java ldap spring-ldap


【解决方案1】:

当客户端连接到 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 不应用于新代码)。

另见

【讨论】:

  • 这听起来很愚蠢,因为我是 LDAP 新手。用户键入的密码是否与 LDAP 服务器的 SECURITY_CREDENTIALS 不同以建立连接?
  • 你会讨厌这个答案:这取决于。也可以代理身份验证,这需要另一个用户的凭据。
【解决方案2】:

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

【讨论】:

  • 我了解这个 JAAS 模块,这是我们未来的要求。出于 POC 的目的,现在我必须解决这个问题。
  • 在这种情况下,您需要使用 LDAP API 并执行“绑定”,将登录凭据传递给 LDAP,并从本质上返回用户已通过身份验证的真/假。之后就可以查询用户的信息了。
  • @ChrisNava 如何传​​递用户名/密码来绑定用户?我将如何连接到 LDAP 服务器?通过用户输入的密码或一些预定义的密码?
  • 你可以试试UnboundId LDAP SDK。我也试过了,效果很好。它比 JNDI 更简单,并支持一些额外的有趣特性。
  • 这取决于您选择的 API。通常,您将用户 ID 和密码传递给绑定方法(将 bind(user,password) 视为您期望 login(user,password) 方法执行的操作。)然后您将执行 search() (或一些这样的)用于用户的组/角色,并将该信息用于访问控制。以上所有内容都非常依赖于 API 和 LDAP 数据库的架构。
猜你喜欢
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
相关资源
最近更新 更多