使用LDAP,Java Play Framework通过Active Directory进行身份验证

时间:2013-09-09 10:56:10

标签: java playframework active-directory ldap windows-authentication

我正在尝试使用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]

这意味着凭据错误。我试图对其进行硬编码,但它仍然不起作用。

1 个答案:

答案 0 :(得分:3)

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

Active Directory允许您绑定username@domain或用户帐户完全区分名称。 DN值通常类似于......

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

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

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

此外,它并没有改变任何内容,但在绑定名称("mail="+email+"\"")中,您有一个结束"但不是开放的。{/ p>