3

我正在尝试使用 LDAP 通过 Windows Active Directory 进行身份验证。我有一个设置上下文的 LDAPContext 类和一个应该在 AD 中找到电子邮件的身份验证方法。

这是我的 LDAPContext 类:

public class LDAPContext extends InitialDirContext {

    Hashtable<String, String> env = new Hashtable<String, String>();


    public LDAPContext(String email, String password) throws NamingException
    {
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://myintranet.com");
        env.put(Context.SECURITY_AUTHENTICATION,"simple");
        env.put(Context.SECURITY_PRINCIPAL,"mail="+email+"\""); // specify the username
        env.put(Context.SECURITY_CREDENTIALS,password);
        DirContext ctx = new InitialDirContext(env);
    }
}

这是我的身份验证方法:

public static User authenticate(final String email, final String password){
    try { 
        LDAPContext adContext = new LDAPContext(email, password);
        Attributes matchAttrs = new BasicAttributes(true);
        matchAttrs.put(new BasicAttribute("mail", email));
        NamingEnumeration<SearchResult> en = adContext.search("", matchAttrs);

       while(en.hasMore()) {
           System.out.println("Found email!!!");
       }
    } catch(NamingException e) {
        System.out.println("NamingException");
    }
...

我不断收到“NamingException”错误。我确定电子邮件在 AD 中,并且指定的电子邮件名称是“mail”。我做错了什么?

编辑:这是我得到的具体错误:

javax.naming.AuthenticationException:[LDAP:错误代码 49 - 80090308:LdapErr:DSID-0C0903A9,注释:AcceptSecurityContext 错误,数据 52e,v1db1]

这意味着凭据是错误的。我试图对其进行硬编码,但它仍然无法正常工作。

4

1 回答 1

3

问题是SECURITY_PRINCIPAL您尝试使用的值不是您可以绑定的有效值。只能与用户名绑定,而不是与用户关联的属性。

Active Directory 允许您在其中一个username@domain或用户帐户上绑定完整的专有名称。DN 值通常类似于...

cn=username,cn=Users,dc=abc,dc=mycompany,dc=com

但实际值取决于您的 AD 配置。

如果您想通过电子邮件地址查找用户,则需要使用管理员 ID(或具有搜索能力的某个 ID)进行绑定,使用该特定电子邮件地址搜索用户,然后使用其用户名重新绑定以认证。

此外,并不是说它会改变任何东西,而是在绑定名称 ( "mail="+email+"\"") 中,您有一个结束"而不是一个开始。

于 2013-09-09T18:11:30.517 回答