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

Posted

技术标签:

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

我知道“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);

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

【问题讨论】:

【参考方案1】:

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

你可能需要类似的东西

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

【讨论】:

你应该看看更好的方法来找到用户:bitbucket.org/jwilleke/examples/src/…【参考方案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")

【讨论】:

欢迎来到 SO!请稍微解释一下您的解决方案并相应地编辑您的问题。有关更多提示,请参阅***.com/help/how-to-ask【参考方案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。否则将无法正常工作。

【讨论】:

以上是关于LDAP:错误代码 49 - 80090308:LdapErr:DSID-0C0903A9,注释:AcceptSecurityContext 错误,数据 52e,v1db1的主要内容,如果未能解决你的问题,请参考以下文章

java ldap验证用户失败 报错ldap:error code 49 -80090308

使用 ldap 时出现 AcceptSecurityContext 错误

java 连接 ldap 报错

LDAP方式连接AD获取用户信息

Wso2 身份服务器连接配置与 Microsoft 活动目录

子错误代码 568 对带有 Active Directory 的 Ldap 错误 49 意味着啥