2015-10-06 61 views
1

我写了一个测试代码,用于通过活动目录服务器认证用户。我可以使用下面的代码使用绑定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'树结构是:

enter image description here

上午我试图用完整的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。现在,同一个用户可以存在于不同的子树中。所以我想从一个特定的子树进行身份验证。

回答

0

与LDAP相关的错误代码49是由无效凭证引起的。

但您可以使用ADSI Edit或AD Explorer等应用程序来获取对象的DN。您可以使用它们查看有问题的对象的“distinguishedName”属性,也可以使用特定于每个应用程序的其他方法。

或用户LDAPExplorerTool 2.找出你想要得到的DN。您可以在secDN属性得到其数值:

enter image description here

+0

请参阅编辑1 – Batty

0

我想知道为什么你需要使用完整的DN指定的用户名? 您可以使用DOMAIN \ USERUSER @ DOMAIN格式对AD进行身份验证。

我个人从未使用任何其他格式,但RFC 2829指定以下基于DN的身份验证标识格式:dn:DN。在你的情况下,SECURITY.PRINCIPAL看起来是dn:CN = batty,OU =未分类,OU = EDN用户,OU =用户帐号,DC = extLDAPTest,DC =本地。再一次,我从来没有使用DN格式,但尝试一下,看看建议的解决方案是否工作。

希望这会有所帮助。

+0

我认为这是我使用的DN格式,并且不工作 – Batty

+0

我之所以使用完整dn的原因是,我将给出服务帐户和子树的dn。现在,同一个用户可以存在于不同的子树中。所以我想从一个特定的子树进行身份验证。 – Batty

+0

具有相同名称的用户不能在同一个AD域内创建,无论其在树内的位置如何。具有相同名称的用户只能在不同的域中创建。知道域名和用户名就足够了。人们不需要知道用户对象位于树中的位置。 尽管如此,请检查RFC 2829.它表示基于DN的用户名应采用“dn:DISTINGUISHED NAME”的格式。所以在你的情况下,它看起来像“dn:CN = batty,OU =未分类,OU = EDN用户,OU =用户帐户,DC = extLDAPTest,DC =本地”。注意字符串“dn:”的开头。 – Boris