Java 如何在ldap中按对象SID搜索用户

Java 如何在ldap中按对象SID搜索用户,java,ldap,sid,Java,Ldap,Sid,我们有这样的设计,当一个SID从一个扫描和同步的Azure AD本地LDAP v3。作为JWT令牌的一部分返回。我需要在本地LDAP中查找用户以进行授权。 SID以一种众所周知的序列化形式出现,由用于初始同步的Microsoft工具支持。以下是LDAP环境: "java.naming.provider.url" -> "ldap://AD2012.local:389" "java.naming.factory.initial" -> "com.sun.jndi.ldap.LdapC

我们有这样的设计,当一个SID从一个扫描和同步的Azure AD本地LDAP v3。作为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搜索中的引用?我知道,如果删除“follow”环境属性,搜索就会失败。 非常感谢您的任何输入。

从LDAP进行操作非常痛苦

ObjectSID是一个二进制值,需要进行转换才能用于:

例如,假设字符串形式的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)

谢谢,但我知道很多。我的转换是正确的,服务器对搜索请求的响应似乎是一个问题。