【问题标题】:Why is baseDN incorrect when doing ldapTemplate.authenticate()?为什么执行 ldapTemplate.authenticate() 时 baseDN 不正确?
【发布时间】:2012-12-03 21:30:11
【问题描述】:

我正在尝试使用 Spring 的 LDAP 包对活动目录进行身份验证,但我不断收到错误消息,指出我指定了错误的 baseDN(Ldap 错误代码 32):

org.springframework.ldap.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-031001E4, problem 2001 (NO_OBJECT), data 0, best match of:
   [testng]     'OU=People,DC=example,DC=com'
   [testng] ]; nested exception is javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-031001E4, problem 2001 (NO_OBJECT), data 0, best match of:
   [testng]     'OU=People,DC=example,DC=com'
   [testng] ]; remaining name 'ou=people,dc=example,dc=com'

奇怪的是 ldapsearch 命令使用了精确的 basedn,并且可以正常工作:

ldapsearch -V -x -H ldap://ad.example.com:389 -b 'ou=people,dc=example,dc=com' -D '<user>' -w '<password>' (sAMAccountName=<user>)

以下代码设置 DN(ldapContextSource 以编程方式设置):

AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("sAMAccountName", user));
DistinguishedName dn = new DistinguishedName("ou=people,dc=example,dc=com");
boolean in = ldapTemplate.authenticate(dn, filter.toString(), password);

不确定这是否有帮助,但这些是其他字段:

userDN = <myusername>@example.com
url = ldap://ad.example.com:389
password = <mypassword>
baseDN = ou=people,dc=example,dc=com

编辑:我更改了 userDN:cn=username,out=people,dc=example,dc=com 这仍然给出错误 32 代码。

【问题讨论】:

    标签: java spring active-directory ldap spring-ldap


    【解决方案1】:

    谢谢各位,你们的线索确实说明了问题所在。

    首先,userDN 确实不正确。我解决了这个问题(请参阅原始帖子中的编辑)。

    第二,由于我已经在ldapContextSource中指定了baseDN,调用authenticate()的时候就不需要再重复了。所以使用DistinguishedName.EMPTY_PATH 解决了这个问题。

    第三,我的 equals 过滤器不正确。当我更改 userDN 时,我忘记了需要将 sAMAccountName 更改为实际登录名,而不是原来设置的 userDN。

    ldapTemplate.authenticate() 现在返回 true,这意味着我已经通过了身份验证。

    【讨论】:

      【解决方案2】:

      我认为这不是基本 DN 问题。我认为未找到该用户。您是否正确设置了搜索范围?

      【讨论】:

      • 我不确定。如果我说 userDN = ,那么我会得到这个错误:LdapErr: DSID-0C0903AA, comment: AcceptSecurityContext error, data 525,这意味着找不到用户。因此,由于我没有收到该错误,因此我只是假设找到了我的 userDN。
      • 你可能是对的。 userDN 看起来很可疑,但让我感到困惑的是为什么我没有收到 AcceptSecurityContext 异常?
      • @user1812844 过滤器的目的是找到 samAccountName 等于“用户”中的任何内容的用户。有这样的用户吗?
      • 是的,现在我只想问问自己。所以发生的事情是我进行身份验证,然后搜索我的用户名。
      【解决方案3】:

      您的 userDN 看起来很可疑。 DN 应类似于 cn='username',ou='rest of path',dc=example,dc=com。我没有在您的代码中看到它的使用,只有用户。用户应该是“用户名”。

      【讨论】:

      • 是的,我改了。我仍然收到同样的错误(见编辑)
      【解决方案4】:

      搜索中的基础对象(-b 参数的值)与简单绑定中使用的可分辨名称(-D 参数)不同。结果代码32(在搜索响应中)表示未找到基础对象(在搜索请求中)。

      另见

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-20
        • 1970-01-01
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多