我具有用于通过Active Directory资源管理器连接到Active Directory的IP,用户名和密码。我正在尝试使用这些凭据通过Java建立连接。但是,AD中未列出用于登录服务器的帐户。

IP="1.1.1.20"
Username="Bob"
Password="password123"


更复杂的是,连接到1.1.1.20的活动目录im的基本dn与用户完整dn中包含的基本dn不同。

1.1.1.20的基本dn是dc = test,dc = this,dc = com,而我用来登录的帐户的DN是

CN=Bob,OU=People,OU=Something,OU=Blah,DC=Fake,DC=Data,DC=local,DC=com


我已经尝试过使用下面的代码片段建立用户名和DN的每种组合。

Hashtable<String, Object> env = new Hashtable<String, Object>();
                env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
                env.put(Context.PROVIDER_URL, "ldap://1.1.1.20:389");
                env.put(Context.SECURITY_AUTHENTICATION, "simple");
                env.put(Context.SECURITY_PRINCIPAL, "CN=Bob,OU=People,OU=Something,OU=Blah,DC=Fake,DC=Data,DC=local,DC=com");
                env.put(Context.SECURITY_CREDENTIALS, "password123");
                DirContext ctx = null;
                try{
                    ctx = new InitialDirContext(env);


当我注释掉SECURITY_PRINCIPAL和SECURITY_CREDENTIALS的行时,我能够建立匿名连接,但是当使用为Active Directory资源管理器提供的用户名和密码时,我无法创建连接。

我知道用户名和密码是正确的,因为我可以使用Active Directory资源管理器登录它们,因此我假设在将用户名和baseDN组合在一起以创建主体时出现了问题。

是否有可能,或者是否需要在我正在查看的同一台服务器上找到我用来登录的帐户?

最佳答案

似乎您知道所使用帐户的完整DN,因此应该可以使用。

我怀疑该域上的简单身份验证已被禁用,或者由于该帐户位于与您要连接的域不同的域上而被禁止。

因此,就像将身份验证方法更改为Kerberos一样容易。尝试用以下命令替换设置Context.SECURITY_AUTHENTICATION的行:

env.put(Context.SECURITY_AUTHENTICATION, "GSSAPI");


有关更多详细信息,请参见this answer

更新:如果不起作用,则可以使用AD资源管理器检查支持的身份验证机制。


右键单击域的根,然后单击“属性”。
点击“ RootDSE属性”标签。
查找“ supportedSASLMechanisms”属性(可能是列表中的最后一个)。


尝试使用该属性中的每个值,看看它们是否有效。

关于java - 与未在Active Directory中列出的用户建立LDAP连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57171796/

10-12 22:54