【问题标题】:LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1LDAP:错误代码 49 - 80090308:LdapErr:DSID-0C0903A9,注释:AcceptSecurityContext 错误,数据 52e,v1db1
【发布时间】:2015-10-03 09:18:19
【问题描述】:

LDAP:错误代码 49 - 80090308:LdapErr:DSID-0C0903A9,注释:AcceptSecurityContext 错误,数据 52e,v1db1

我知道“52e”代码是用户名有效但密码无效的情况。我在我的 apache studio 中使用相同的用户名和密码,我能够成功地建立到 LDAP 的连接。

这是我的 java 代码

    String userName = "*******";
    String password = "********";
    String base ="DC=PSLTESTDOMAIN,DC=LOCAL";
    String dn = "cn=" + userName + "," + base;  
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://******");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, dn);
    env.put(Context.SECURITY_CREDENTIALS, password);
    LDAPAuthenticationService ldap = new LDAPAuthenticationService();
   // LdapContext ctx;
    DirContext ctx = null;
    try {
        ctx = new InitialDirContext(env);

我的错误在这一行ctx = new InitialDirContext(env);

我不知道究竟是什么导致了这个错误。

【问题讨论】:

    标签: authentication ldap


    【解决方案1】:

    数据 52e - Returns when username is valid but password/credential is invalid.

    你可能需要类似的东西

    String dn = "cn=" + userName + "," + "CN=Users," + base;  
    

    【讨论】:

    【解决方案2】:

    对我来说,当我这样设置主要部分时,问题就解决了:

    env.put(Context.SECURITY_PRINCIPAL, userId@domainWithoutProtocolAndPortNo);
    

    【讨论】:

    • @sbmc7 您在实例化 javax.naming.ldap.InitialLdapContext 时在传递的环境 HashTable 中设置它,即 context = new InitialLdapContext(env, null);其中 env 是一个 HashTable。
    • 感谢发帖,尝试了所有我能想到的 CN、OU 和 DC 的不同组合,但这种方法是唯一适合我的方法!我使用了 userID@DC1.DC2
    • 是的,@Vishal,这也对我有用。在我遇到您的答案之前,我一直在搜寻互联网是不走运的。我真的很感激这一点。谢谢
    • 也为我工作。您能否向我们提供更多解释为什么它有效?
    【解决方案3】:

    52e 1326 ERROR_LOGON_FAILURE 当用户名有效但密码/凭证无效时返回。将防止大多数其他错误按说明显示。

    http://ldapwiki.com/wiki/Common%20Active%20Directory%20Bind%20Errors

    【讨论】:

      【解决方案4】:

      就我而言,我必须使用 <username>@<domain> 之类的东西才能成功登录。

      sample_user@sample_domain

      【讨论】:

        【解决方案5】:

        当您将 Context.SECURITY_AUTHENTICATION 用作“简单”时,您需要提供 userPrincipalName 属性值 (user@domain_base)。

        【讨论】:

          【解决方案6】:

          在 CAS 上使用 AD 时我遇到了类似的问题,即 52e 错误,在我的情况下,应用程序接受 CN= 形式的全名而不是实际用户名。

          例如,如果您有一个全名是 Ross Butler 并且他们的登录用户名是 rbutler 的用户——您通常会输入类似 cn=rbutler,ou=Users,dc=domain,dc=com 但我们的用户名失败每次。通过将其更改为 cn=Ross Butler,ou=Users,dc=domain,dc=com 它通过了!!

          【讨论】:

          • 可视化 AD 预期语法的一种方法是使用“属性编辑器”选项卡,如 this question 中所述。如果您向下滚动到“cn”,您可能会找到答案。
          【解决方案7】:

          对我来说,通过在用户名中添加域名来解决问题,如下所示:

          string userName="yourUserName";
          string password="passowrd";
          string hostName="LdapServerHostName";
          string domain="yourDomain";
          System.DirectoryServices.AuthenticationTypes option = System.DirectoryServices.AuthenticationTypes.SecureSocketsLayer; 
          string userNameWithDomain = string.Format("{0}@{1}",userName , domain);
          DirectoryEntry directoryOU = new DirectoryEntry("LDAP://" + hostName, userNameWithDomain, password, option);
          

          【讨论】:

            【解决方案8】:

            如果您调试并查看 ctx=null,也许您的用户名有问题,您应该这样写 "ac\administrator"(双 "\") 或 "administrator@ac"

            【讨论】:

              【解决方案9】:

              向另一个服务器数据库发送事务时,LDAP 正在尝试通过 AD 进行身份验证。此身份验证失败,因为用户最近更改了她的密码,尽管此事务是使用以前的凭据生成的。此身份验证将一直失败,直到 ... 除非您将事务状态更改为 Complete 或 Cancel,在这种情况下 LDAP 将停止发送这些事务。

              【讨论】:

                【解决方案10】:

                对我来说,问题是通过像这样更改环境来解决的:

                 env.put("LDAP_BASEDN", base)
                 env.put(Context.SECURITY_PRINCIPAL,"user@domain")
                

                【讨论】:

                【解决方案11】:

                使用域名可以解决问题(使用powershell获取域名:$env:userdomain):

                    Hashtable<String, Object> env = new Hashtable<String, Object>();
                    String principalName = "domainName\\userName";
                    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
                    env.put(Context.PROVIDER_URL, "ldap://URL:389/OU=ou-xx,DC=fr,DC=XXXXXX,DC=com");
                    env.put(Context.SECURITY_AUTHENTICATION, "simple");
                    env.put(Context.SECURITY_PRINCIPAL, principalName);
                    env.put(Context.SECURITY_CREDENTIALS, "Your Password");
                
                    try {
                        DirContext authContext = new InitialDirContext(env);
                        // user is authenticated
                        System.out.println("USER IS AUTHETICATED");
                    } catch (AuthenticationException ex) {
                        // Authentication failed
                        System.out.println("AUTH FAILED : " + ex);
                
                    } catch (NamingException ex) {
                        ex.printStackTrace();
                    }
                

                【讨论】:

                • 请解释一下为什么使用域是解决方案?
                • 我认为某些 LDAP 需要域。如果我们只传递用户名,服务器不会接受。
                【解决方案12】:

                对我来说,问题的原因是用户名的格式不正确。它之前被指定为“mydomain\user”。我删除了域部分,错误消失了。

                PS 我使用的是 ServerBind 身份验证。

                【讨论】:

                  【解决方案13】:

                  我已经测试了三种不同的方法,它们都有效:

                  env.put(Context.SECURITY_PRINCIPAL, "user");
                  env.put(Context.SECURITY_PRINCIPAL, "user@domain.com");
                  env.put(Context.SECURITY_PRINCIPAL, "CN=user,OU=one,OU=two,DC=domain,DC=com");
                  

                  如果使用最后一个,别忘了设置用户所属的所有OU。否则将无法正常工作。

                  【讨论】:

                    猜你喜欢
                    • 2014-04-02
                    • 2019-10-13
                    • 1970-01-01
                    • 2018-02-22
                    • 1970-01-01
                    • 2018-11-11
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多