我写了一个测试代码,用于通过活动目录服务器认证用户。我可以使用下面的代码使用绑定dn进行身份验证。java - 活动目录 - 使用基地认证dn
public static void main(String[] args) {
LdapContext ldapContext = null;
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldaps://10.121.85.24:636");
env.put(Context.SECURITY_PROTOCOL, "ssl");
env.put(Context.SECURITY_PRINCIPAL, "EXTLDAPTEST\batty"); // line 1
env.put(Context.SECURITY_CREDENTIALS, "mypassword");
env.put("com.sun.jndi.ldap.read.timeout", Integer.toString(8000));
env.put("java.naming.ldap.factory.socket", "com.auth.server.TrustAllSSLSocketFactory");
try {
ldapContext = new InitialLdapContext(env, null);
} catch (Exception e) {
e.printStackTrace();
}
if (ldapContext != null)
{
System.out.println("Authenticatied");
}
}
但是,当我替换第1行与
env.put(Context.SECURITY_PRINCIPAL, "CN=batty,OU=Unsorted,OU=EDN Users,OU=User accounts,DC=extLDAPTest,DC=local"); // line 1
它抛出异常作为
javax.naming.AuthenticationException:[LDAP:错误代码49 - 80090308:LdapErr:DSID- 0C0903A9,评论:AcceptSecurityContext错误,数据52e,v1db1
AD'树结构是:
上午我试图用完整的DN进行身份验证时做错了什么?
编辑1: 当我使用的服务帐户来获得完整的DN使用
NamingEnumeration<?> aa = context.list("OU=Unsorted,OU=EDN Users,OU=User accounts,DC=extLDAPTest,DC=local");
我得到以下结果:
CN =巴蒂,OU =未排序,OU = EDN用户,OU =用户帐户,DC = extLDAPTest,DC =本地
这与我通过身份验证相同。
编辑2:我使用全dn的原因是,我会给一个子树的服务帐号和dn。现在,同一个用户可以存在于不同的子树中。所以我想从一个特定的子树进行身份验证。
请参阅编辑1 – Batty