如何通过ldap中的对象SID搜索用户

时间:2019-05-26 21:22:58

标签: java ldap sid

当具有来自Azure AD本地LDAP v3的扫描SID并与之同步时,我们采用这种设计。作为JWT令牌的一部分返回。我需要出于授权目的在本地LDAP中找到用户。 SID以众所周知的序列化形式出现,该序列由用于初始同步的Microsoft工具支持。这是LDAP环境:

"java.naming.provider.url" -> "ldap://AD2012.local:389"
 "java.naming.factory.initial" -> "com.sun.jndi.ldap.LdapCtxFactory"
 "com.sun.jndi.ldap.connect.timeout" -> "0"
 "java.naming.security.principal" -> "CN=Administrator,CN=Users,DC=AD2012,DC=local"
 "java.naming.security.authentication" -> "simple"
 "java.naming.security.credentials" -> "Password1"
 "java.naming.referral" -> "follow"

请注意最后一个,因为我认为这很重要。

在测试中,我首先运行搜索以使用以下字符串获取用户:

(&(|(objectClass=User)(objectClass=userProxy))(cn=Administrator*))

工作正常,让我获取此用户的SID,在进行字符串转换后,它看起来像

S-1-5-21-1061109567-1712144220-1378238271-319

但是当我构造第二个搜索字符串时:

(&(|(objectClass=User)(objectClass=userProxy))(objectSid=S-1-5-21-1061109567-1712144220-1378238271-319))

搜索结果为空。但是,有一个线索:使用调试器检查结果对象将发现它具有以下属性:

refEx.handleReferrals = 1
refEx.nextReferralEx = LdapReferralException: Continuation Reference ...
refEx.nextReferals.referrals[0] = ldap://DomainDnsZones.AD2012.local/DC=DomainDnsZones,DC=AD2012,DC=local

这里是问题:为什么服务器在第二个查询中(SID)不遵循引荐?我知道它首先会这样做,因为如果删除“关注”环境属性,搜索将失败。 任何输入,我们将不胜感激。

1 个答案:

答案 0 :(得分:-1)

ObjectSID很难从LDAP使用。

ObjectSID是一个二进制值,需要将其转换为用于LDAP Search Filters

例如,假设您的字符串形式的SID是S-1-5-21-2562418665-3218585558-1813906818-1576。二进制形式是:

01,05,00,00,00,00,00,05,15,00,00,00,e9,67,bb,98,d6,b7,d7,bf,82,05,1e,6c,28,06,00,00

因此LDAP搜索过滤器为:

(objectSid=\01\05\00\00\00\00\00\05\15\00\00\00\e9\67\bb\98\d6\b7\d7\bf\82\05\1e\6c\28\06\00\00)