1

我有一个 IP、用户名和密码,用于通过 Active Directory Explorer 连接到 Active Directory。我正在尝试使用这些凭据通过 Java 建立连接。但是,我登录服务器的帐户并没有在 AD 中列出。

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

更复杂的是,在 1.1.1.20 上连接的活动目录的基本 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 Explorer 的用户名和密码时,我无法创建连接。

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

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

4

1 回答 1

0

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

我怀疑在域上禁用了简单身份验证,或者由于该帐户位于与您连接的域不同的域上,因此不允许使用简单身份验证。

因此,它可能就像将身份验证方法更改为 Kerberos 一样简单。尝试用这个替换设置的行Context.SECURITY_AUTHENTICATION

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

有关更多详细信息,请参阅此答案

更新:如果这不起作用,那么您可以使用 AD Explorer 检查支持的身份验证机制。

  1. 右键单击域的根目录,然后单击“属性”。
  2. 单击“RootDSE 属性”选项卡。
  3. 查找“supportedSASLMechanisms”属性(可能是列表中的最后一个)。

尝试该属性中的每个值,看看它们中的任何一个是否有效。

于 2019-07-24T12:42:09.407 回答