我正在尝试使用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]
这意味着凭据错误。我试图对其进行硬编码,但它仍然不起作用。
答案 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>