1

我正在尝试使用 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 代码。

4

4 回答 4

5

谢谢大家,你的线索确实阐明了这个问题。

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

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

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

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

于 2012-12-04T17:54:22.710 回答
1

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

于 2012-12-03T21:34:26.957 回答
1

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

于 2012-12-04T04:28:47.970 回答
1

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

也可以看看

于 2012-12-04T09:21:28.230 回答