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

3

我正在尝试使用LDAP通过Windows Active Directory进行身份验证。我有一个LDAPContext类来设置上下文,还有一个authenticate方法,可以在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:error code 49 - 80090308:LdapErr:DSID-0C0903A9,comment:AcceptSecurityContext error,data 52e,v1db1]
这意味着凭据不正确。我已经尝试硬编码,但仍然无法正常工作。
1个回答

3
问题在于您尝试使用的SECURITY_PRINCIPAL值不是可以绑定的有效值。只能使用用户名进行绑定,而不能使用与用户相关联的属性。
Active Directory允许您在username@domain或用户帐户的完整可区分名称上进行绑定。DN值通常类似于...
cn=username,cn=Users,dc=abc,dc=mycompany,dc=com

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

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

另外,请注意,虽然在绑定名称中("mail="+email+"\""),您有一个闭合的",但没有一个开放的",但这并不会改变任何东西。


谢谢你的帮助!现在凭证/主体似乎可以工作了。但是现在我遇到了另一个错误:javax.naming.NotContextException: Not an instance of DirContext 我尝试过在谷歌上搜索,但找不到解决方案。你有什么想法吗? - Kungen
我已经在LDAPClass中添加了 env.put(Context.REFERRAL, "follow");,现在我不再收到任何异常。 - Kungen
@Kungen:很高兴你解决了问题。但我不太清楚,是我的回答帮你解决了问题,还是你做了其他改动解决了它?NotContextException通常表示您添加到 HashTable 的属性存在问题,但在我看来,将REFERRAL设置为follow不应该解决该问题。无论如何,很高兴现在它能工作了。 - Syon
你的回答解决了问题的一部分,特别是username@domain这个问题。但是当我修复它后,出现了NotContextException错误,而设置REFFERAL解决了这个问题。好的,既然你的回答是解决方案的一部分,我会接受它的。谢谢! - Kungen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接