Spring Security & Active Directory LDAP 错误 32 问题 2001 (NO_OBJECT)

Posted

技术标签:

【中文标题】Spring Security & Active Directory LDAP 错误 32 问题 2001 (NO_OBJECT)【英文标题】:Spring Security & Active Directory LDAP Error 32 problem 2001 (NO_OBJECT) 【发布时间】:2011-11-21 08:17:54 【问题描述】:

我正在尝试使用 Spring 框架和 Spring Security 3.0 再次验证用户 AD LDS\ADAM。我不断收到以下错误,希望这里的人可以解释问题所在。

[LDAP: error code 32 - 0000208D: NameErr: DSID-0315258B, problem 2001 (NO_OBJECT), data 0, best match of: 'CN=Users,DC=Domain,DC=local' ]; nested exception is javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-0315258B, problem 2001 (NO_OBJECT), data 0, best match of: 'CN=Users,DC=Domain,DC=local' ]; remaining name 'cn=Mo Logan,cn=Users,dc=Domain,dc=local'

谁能解释最佳匹配和剩余名称位的含义 - 这真的让我感到困惑吗?这种类型的搜索是否区分大小写?服务器和客户端之间的时间差异等问题会产生影响吗?

根据我在线阅读的错误代码 32 表示找不到对象 - 非常有帮助,我相信您会同意的。这是我正在使用的配置信息:

<authentication-manager alias="ldapAuthenicationManager">   
    <ldap-authentication-provider
        user-search-base="cn=Users,dc=Domain,dc=local" 
        user-search-filter="(uid=0)" 
        role-prefix="Users"
    />
</authentication-manager>

<ldap-server url="ldap://server:50006/" manager-dn="CN=Admin,CN=Users,DC=Domain,DC=local" manager-password="Password101" />

我正在按 uid 搜索(LDS 中没有 SAMAccountName),当我在服务器上使用 ldap.exe 按相同条件搜索时,我可以正确找到用户,例如:

ldap_search_s(ld, "CN=Users,DC=Domain,DC=local", 2, "(uid=mologan)", attrList,  0, &msg)

***Searching...

ldap_search_s(ld, "CN=Users,DC=Domain,DC=local", 2, "(uid=mologan)", attrList,  0, &msg)

Getting 1 entries:

Dn: CN=Mo Logan,CN=Users,DC=Domain,DC=local

badPasswordTime: 9/20/2011 1:19:51 PM GMT Standard Time; 

badPwdCount: 0; 

cn: Mo Logan; 

distinguishedName: CN=Mo Logan,CN=Users,DC=Domain,DC=local; 

dSCorePropagationData: 0x0 = (  ); 

instanceType: 0x4 = ( WRITE ); 

lastLogonTimestamp: 9/20/2011 9:10:32 AM GMT Standard Time; 

lockoutTime: 0; 

memberOf (2): CN=DMSUsers,CN=Users,DC=Domain,DC=local; CN=Users,CN=Roles,CN=Users,DC=Domain,DC=local; 

msDS-UserAccountDisabled: FALSE; 

name: Mo Logan; 

objectCategory: CN=Person,CN=Schema,CN=Configuration,CN=BD500A33-CE7C-492F-9007-BF1B17F972EE; 

objectClass (4): top; person; organizationalPerson; user; 

objectGUID: 40f74ed4-6cf3-495e-a28c-6aa080a0333b; 

objectSid: S-1-514506224-2209559093-2723712157-1234827279-3369888698-2052446679; 

pwdLastSet: 9/20/2011 8:19:06 AM GMT Standard Time; 

uid: mologan; 

uSNChanged: 13994; 

uSNCreated: 13985; 

whenChanged: 9/20/2011 9:10:32 AM GMT Standard Time; 

whenCreated: 9/20/2011 8:16:54 AM GMT Standard Time; 

我作为管理员帐户绑定到 AD LDS,该帐户属于角色下的读者组。此用户与我要验证的用户名处于同一级别。

您可能会说我完全不知道为什么会出现此错误,希望有人能够帮助我或指出正确的方向,

提前致谢

【问题讨论】:

【参考方案1】:

我想我终于弄明白了,希望这对其他人有帮助。以下是我的安全配置:

<authentication-manager alias="ldapAuthenicationManager">    
    <ldap-authentication-provider           
            user-search-filter="(uid=0)" 
            group-search-filter="(member=userGroup)"
        >     
    </ldap-authentication-provider>     
</authentication-manager> 

<ldap-server url="ldap://server:50006/CN=Users,CN=Domain,CN=local" manager-dn="Cn=Admin,CN=Domain,CN=local" manager-password="Password101" />

我必须在 LDS 中创建一个名为 admin 的用户,并将其分配给 LDS 中的 reader 角色(如果没有,请从为 LDS 提供的 ldf 文件中导入它)。现在创建一个用户,然后创建一个组,将用户添加到在 AD 中创建的组中

此时我收到 Ldap 错误 32。在通过 spring 安全代码进行调试并查看服务器的事件日志后,我猜测问题出在 AD LDS 的设置方式上。经过大量的摆弄和猜测工作,我偶然发现了这个问题。

为了解决这个问题,我最终将我想要登录的用户(不是 manager-dn)添加到读者组以允许成功绑定。这样做解决了问题。

希望这有用吗?

【讨论】:

【参考方案2】:

我注意到你的问题中有一个奇怪的地方。您进行搜索:

ldap_search_s(ld, "CN=Users,DC=Domain,DC=local", 2, "(uid=mologan)", attrList, 0, &msg)

使用(uid=mologan) 作为过滤器,结果返回uid: chweeks 是否只是另一个搜索结果的错字复制/过去?

你写的关于LDAP.EXE的另一件事你的意思是LDP.EXE

----已编辑-----

你能不能试试这种配置

<authentication-manager alias="ldapAuthenicationManager">    
    <ldap-authentication-provider 
        user-search-base="cn=Users"  
        user-search-filter="(uid=0)"  
        role-prefix="Users" 
    /> 
</authentication-manager> 

<ldap-server url="ldap://server:50006/dc=Domain,dc=local" manager-dn="CN=Admin,CN=Users,DC=Domain,DC=local" manager-password="Password101" /> 

【讨论】:

是的,这是一个复制和粘贴错误 - 我抓住了错误的搜索结果并关闭了窗口并尝试修复它。 感谢您的指点,不幸的是,我再次尝试了这个,但没有任何乐趣。或多或少相同的错误,但 DN 较短,例如:[LDAP:错误代码 32 - 0000208D:NameErr:DSID-0315258B,问题 2001(NO_OBJECT),数据 0,最佳匹配:'CN=Users,DC=Domain, DC=本地'];嵌套异常是 javax.naming.NameNotFoundException: [LDAP: 错误代码 32 - 0000208D: NameErr: DSID-0315258B, 问题 2001 (NO_OBJECT), 数据 0, 最佳匹配: 'CN=Users,DC=Domain,DC=local' ];剩余名称 'cn=Mo Logan,cn=Users'

以上是关于Spring Security & Active Directory LDAP 错误 32 问题 2001 (NO_OBJECT)的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot & Security with AngularJS 登录页面

Spring boot & Spring security 总是重定向到 Login

如何使用 Spring MVC & Security、Jasig CAS 和 JSP 视图在 Spring Boot 2 中配置 UTF-8?

Sencha Touch 2 & Spring Security 跨域登录

Spring Security RememberMe & RESTful API

Spring boot + Spring Security实现权限管理