【问题标题】:Java LDAP authentication with username使用用户名的 Java LDAP 身份验证
【发布时间】:2017-04-02 15:29:11
【问题描述】:

好吧,这快把我逼疯了。我正在尝试使用 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]

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

【问题讨论】:

    标签: java ldap


    【解决方案1】:

    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。只需传递用户名@域和瞧 - 就像一个魅力:) 再次感谢!

    【讨论】:

    • 虽然如果所有的星都对齐并且用户名@exmaple.com 一致,您的方法将起作用,但@EJP 方法是最佳实践。可以在以下位置找到示例:bitbucket.org/jwilleke/examples/src/…
    • 我的方法在没有星星对齐的情况下完美运行;)用户只需按照在 AD 中使用的方式使用他们的用户名 - 普通用户名。我在最后附上@domaindetails 并通过 if 进行身份验证。如果身份验证不成功 - 抛出 AuthenticationException。不错,干净,简单,快速!您不必使用管理员 LDAP 帐户,使用它进行身份验证,搜索其他帐户,检索 DN,然后检查密码......
    • 就我而言,它与 username@myldap.mydomain.com 一起使用
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-09-01
      • 2017-07-31
      • 1970-01-01
      • 2014-03-08
      • 2016-10-01
      • 2016-09-12
      • 1970-01-01
      • 2015-12-04
      • 2012-06-27
      相关资源
      最近更新 更多