Java 在jsp中读取Active Directory用户名

Java 在jsp中读取Active Directory用户名,java,active-directory,Java,Active Directory,我试图读取Active Directory中的用户名,但出现错误。错误是: 线程“main”javax.naming.AuthenticationException中出现异常:[LDAP:错误代码49-80090308:LDAPPER:DSID-0C09003AA,注释:AcceptSecurityContext错误,数据525,v1772] 但是,我的代码是: package client; import javax.naming.Context; import javax.n

我试图读取Active Directory中的用户名,但出现错误。错误是: 线程“main”javax.naming.AuthenticationException中出现异常:[LDAP:错误代码49-80090308:LDAPPER:DSID-0C09003AA,注释:AcceptSecurityContext错误,数据525,v1772]

但是,我的代码是:

package client;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.directory.*;
    import javax.naming.ldap.*;
    import javax.naming.*;
    import java.util.Hashtable;
    import java.util.Enumeration;
public class AD {
    public AD() {
        super();
    }


            public static void main(String[] args) throws NamingException {
                    Hashtable envVars = new Hashtable();
                    envVars.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
                    envVars.put(Context.PROVIDER_URL, "ldap://" + "IP:Port");
                    envVars.put(Context.SECURITY_AUTHENTICATION, "simple");
                    envVars.put(Context.SECURITY_PRINCIPAL, "username");
                    envVars.put(Context.SECURITY_CREDENTIALS, "password");


                    DirContext myContext = new InitialDirContext(envVars);
                    try{

                    SearchControls searchCtrls = new SearchControls();
                    searchCtrls.setSearchScope(SearchControls.SUBTREE_SCOPE);
                    String[] attributes = { "cn", "telephoneNumber", "sn", "userPrincipalName","memberOf","name" };
                    searchCtrls.setReturningAttributes(attributes);


                    String filter = "(objectClass=organizationalPerson)";
                    NamingEnumeration values = myContext.search("CN=Users,DC=bma.gov.bh,DC=gov,DC=bh",filter, searchCtrls);
                    while (values.hasMoreElements())
                    {
                           SearchResult result = (SearchResult) values.next();
                            Attributes attribs = result.getAttributes();


                            if (null != attribs)
                            {
                                    for (NamingEnumeration ae = attribs.getAll(); ae.hasMoreElements();)
                                    {
                                            Attribute atr = (Attribute) ae.next();
                                            String attributeID = atr.getID();
                                            for (
                                                    Enumeration vals = atr.getAll(); 
                                                    vals.hasMoreElements(); 
                                                    System.out.println(attributeID +": " +vals.nextElement()) );
                                    }
                            }
                    }


                    myContext.close();


                    }

                    catch(Exception e)
                    {
                            //e
                    }
            }



}
问题从这一行开始:

DirContext myContext = new InitialDirContext(envVars);

你能帮忙吗?

你得到的错误代码
80090308
可以在中找到,上面写着

提供给函数的令牌无效

最可能的原因是Active Directory希望密码是UTF-8编码的字节数组,而Java字符串不是这样

尝试更改代码,如下所示:

envVars.put(Context.SECURITY_CREDENTIALS, "password".getBytes("UTF8"));

请注意,代码80090308未完全识别此问题。因为数据代码提供了有关问题的一些详细信息:

  • 525找不到用户
  • 52e无效凭据
  • 530此时不允许登录
  • 531不允许在此工作站登录
  • 532密码已过期
  • 533帐户已禁用
  • 701帐户已过期
  • 773用户必须重置密码
  • 775用户帐户已锁定
有关更多详细信息,请参见本页:


非常感谢IBM的支持

我试图替换上面的行,但它在上给了我一个错误。getBytesExceptions未被处理:java.io.UnsupportedEncodingException仅用try-catch子句将其包围。对于此异常,始终支持UTF8,因此您可以安全地忽略它<代码>尝试{envVars.put(Context.SECURITY_凭证,“password”.getBytes(“UTF8”);}catch(java.io.UnsupportedEncodingException e){/*忽略*/}谢谢,它成功了。但是,它显示连接失败的错误。