用户名为

时间:2016-02-11 20:19:46

标签: java ldap

好的,这让我发疯了。我尝试使用Java创建LDAP身份验证,如果我在SECURITY_PRINCIPAL中使用我的名字和姓氏,一切都很好。这是我的代码:

 try {
    Hashtable<String, String> ldapEnv = new Hashtable<String, String>();
    ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    ldapEnv.put(Context.PROVIDER_URL,  "LDAP://myldap.mydomain.com:389");
    ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
    ldapEnv.put(Context.SECURITY_PRINCIPAL, "CN=FirstName LastName" + ",ou=Users");    
    ldapEnv.put(Context.SECURITY_CREDENTIALS, "password");

    DirContext ldapContext = new InitialLdapContext(ldapEnv, null);
    }
    catch (Exception e) {
      System.out.println(" bind error: " + e);
      e.printStackTrace();
   }

问题是它无法使用我的用户名。如果我尝试:

ldapEnv.put(Context.SECURITY_PRINCIPAL, "CN=myusername" + ",ou=Users");

ldapEnv.put(Context.SECURITY_PRINCIPAL, "uid=myusername" + ",ou=Users");

我总是得到[LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1]

由于某种原因,这似乎只适用于我的名字和姓氏。我检查了AD,我的sAMAccountName是我正确的用户名。不知道为什么会这样。其他人有这样的问题吗?我可以将其他内容传递给Context.SECURITY_PRINCIPAL吗?我尝试了ldapEnv.put(Context. SECURITY_PRINCIPAL , "sAMAccountName=myusername" + ",ou=Users");,但也失败了......有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

EJP,感谢您的投入。你确实是正确的,但我正在寻找一些简单的东西 - 只需将用户名和密码传递给AD,看看它是否正在验证。我应该在我的第一篇文章中更具体。你的建议会奏效,但我认为这更简单:

            Hashtable props = new Hashtable();
            String principalName = "username@mydomain.com";
            props.put(Context.SECURITY_PRINCIPAL, principalName);
            props.put(Context.SECURITY_CREDENTIALS, "mypassword");
            DirContext context;

                //try to authenticate
            try {

                   context = com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance("LDAP://myldap.mydomain.com:389" + '/', props);
                   context.close();                    
            }

这样我不关心DN。只需传递用户名@ domain和voila - 就像魅力一样:)再次感谢!

答案 1 :(得分:1)

没有条目的DN包含UID或CN = username。您必须提供存在的条目,而不仅仅是任意属性字符串。通常的技术是以管理员用户身份绑定,搜索具有该UID的用户或他向您的登录系统提供的任何内容,检索该用户的DN,然后尝试使用用户提供的oassword绑定该DN。 / p>