JAVA LDAP错误javax.naming.NamingException:[LDAP:错误代码1-000004DC:LDAPPER:DSID-0C09075A

JAVA LDAP错误javax.naming.NamingException:[LDAP:错误代码1-000004DC:LDAPPER:DSID-0C09075A,java,c#,ldap,Java,C#,Ldap,我有一个C#代码来连接LDAP服务器,它工作得非常好 工作C#代码如下所示 user = "myname@myorg.com"; string pwd = "secret"; String uid = "uid=" + user + ",ou=people,dc=myorg,dc=com"; int empID = 0; DirectoryEntry root = new DirectoryEntry("LDAP:

我有一个C#代码来连接LDAP服务器,它工作得非常好

工作C#代码如下所示

        user = "myname@myorg.com";
        string pwd = "secret";

        String uid = "uid=" + user + ",ou=people,dc=myorg,dc=com";
        int empID = 0;
        DirectoryEntry root = new DirectoryEntry("LDAP://myorg.com", user, pwd, AuthenticationTypes.None);
        try
        {
            object connected = root.NativeObject;

            DirectorySearcher search = new DirectorySearcher(root);

            search.Filter = "(&(objectClass=user)(objectCategory=Person))";

            search.PropertiesToLoad.Add("SAMAccountName");
            search.PropertiesToLoad.Add("EmployeeID");

            foreach (System.DirectoryServices.SearchResult resEnt in search.FindAll())
            {
                System.DirectoryServices.DirectoryEntry de = resEnt.GetDirectoryEntry();

                if (de.Properties["employeeID"].Value != null && de.Properties["userPrincipalName"].Value != null)
                {
                    if (user.Equals(de.Properties["userPrincipalName"].Value))
                    {
                        string empIDstr = (string)de.Properties["employeeID"].Value;

                        int.TryParse(empIDstr, out empID);
                        Response.Write("EMp ID is No is "+empID);
                    }

                }
            }
        }
        catch(Exception ex)
        {
            Response.Write("Logon failed");
        }
现在我正试图用java做同样的事情,因为我有另一个应用程序要用java开发,但是下面的代码抛出了异常

public class LdapClient {


    public void authenticate(String user, String pwd){

        String uid = "uid=" + user + ",ou=people,dc=myorg,dc=com";

        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://myorg.com");
        env.put(Context.SECURITY_AUTHENTICATION, "none");
        env.put(Context.SECURITY_PRINCIPAL, uid);
        env.put(Context.SECURITY_CREDENTIALS, pwd);

        try {
            DirContext ctx = new InitialDirContext(env);

            **//THE ERROR COMES AT THE LINE BELOW**
            NamingEnumeration<?> namingEnum = ctx.search("ou=people,dc=myorg,dc=com", "(&(objectclass=user)(objectCategory=Person))", getSimpleSearchControls());
            **strong text**
            while (namingEnum.hasMore ()) {
                SearchResult result = (SearchResult) namingEnum.next ();    
                Attributes attrs = result.getAttributes ();
                System.out.println(attrs.get("cn"));

            } 
            namingEnum.close();
        } catch (Exception e) {
            try {
                e.printStackTrace();
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    }

    private SearchControls getSimpleSearchControls() {
        SearchControls searchControls = new SearchControls();
        searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        String[] attrIDs = {"samAccountName","employeeID"};
        searchControls.setReturningAttributes(attrIDs);
        return searchControls;
    }

}

我必须在Java中执行此操作,因为我需要开发指向同一LDAP服务器的另一个应用程序。客户端需要是Java。请帮助执行此操作(搜索)之前,异常情况表明它需要身份验证(绑定)。 如中所示,请尝试使用
simple
身份验证

// Authenticate as S. User and password "mysecret"
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");

您的建议已经到位(请参见下文)
String uid=“uid=“+user+”,ou=people,dc=myorg,dc=com”;env.put(Context.SECURITY\u PRINCIPAL,uid)
另外,在相应的C#代码中,它的
身份验证类型。None
,因此我使用了“None”在java中用于
Context.SECURITY\u身份验证
@RohitGaneshan,来自文档AuthenticationTypes。None代表由'env.put(Context.SECURITY\u AUTHENTICATION,“simple”);指定的java中的'simple bind'。我做了建议的更改,但现在又出现另一个错误
javax.naming.AuthenticationException:[LDAP:错误代码49-80090308:LDAPPER:DSID-0C090400,注释:AcceptSecurityContext错误,数据52e,v1db1]
这是一个身份验证异常,意味着用户名/密码存在一些问题。请在此查找可能的解决方案。我可以通过尝试上述线程中的答案登录到服务器。但这变得有点奇怪。通常我们使用唯一的用户名或电子邮件登录LDAP,如
cn=myname@myorg.com
。但在这里例如,我只能在给出
cn=Full Name
后才能登录到服务器,这是上述线程中建议的解决方法之一。因此,例如
cn=Ross Buttler
在哪里工作,因为用户名
cn=rbutler
将不起作用。但是可以有两个人拥有相同的全名“Ross Buttler”那么,系统如何唯一地识别用户?这个问题存在于Java中,而不是C中#
// Authenticate as S. User and password "mysecret"
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");