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

93

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);

我不知道具体是什么原因导致了这个错误。

15个回答

42

1
你应该查看一种更好的查找用户的方法:https://bitbucket.org/jwilleke/examples/src/dba1d74d172f9a3f13fc375f6d17370b6da91adf/Examples-JNDI/src/com/willeke/samples/ldap/jndi/BasicAdminSearchBind.java?at=master - jwilleke

36
对我来说,当我将主要部分设置为这样时,问题得到了解决。
env.put(Context.SECURITY_PRINCIPAL, userId@domainWithoutProtocolAndPortNo);

你可以在实例化javax.naming.ldap.InitialLdapContext时通过传递一个环境HashTable来设置这个。例如:context = new InitialLdapContext(env, null);其中env是一个HashTable。

你可以在实例化javax.naming.ldap.InitialLdapContext时传递一个环境HashTable来设置它,例如:context = new InitialLdapContext(env, null); 其中env是一个HashTable。 - Vishal
感谢您的发布,我尝试了所有我能想到的CN、OU和DC的不同组合,但这种方法是唯一适用于我的!我使用了userID@DC1.DC2 - emily
是的,@Vishal,这对我也起作用了。在我找到你的答案之前,我曾经在互联网上苦苦寻找,但没有成功。我非常感激。谢谢。 - Artanis Zeratul
也对我有用。您能否提供更多关于为什么它有效的解释? - user613114

18
在我的情况下,我必须使用类似于<username>@<domain>的格式才能成功登录。 sample_user@sample_domain

18

14

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


8

在使用CAS时,我遇到了一个类似的问题,即52e错误。在我的情况下,当以CN=形式而不是实际用户名形式输入全名时,应用程序会接受。例如,如果您有一个用户名为rbutler的用户,其全名为Ross Butler,通常您会输入cn=rbutler,ou=Users,dc=domain,dc=com,但我们的每一次都失败了。将其更改为cn=Ross Butler,ou=Users,dc=domain,dc=com后,它通过了!!


一种可视化AD期望语法的方法是使用“属性编辑器”选项卡,如此问题中所述。如果您向下滚动到“cn”,您可能会找到答案。 - simonpa71

3

我解决了这个问题,方法是在用户名中添加域名,具体如下:

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);

2
如果你调试并且发现ctx=null,可能是你的用户名有问题,你应该这样写:"ac\\administrator"(双“\”)或者 "administrator@ac"。最初的回答。

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

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。否则它将无法工作。

2
对我来说,问题的原因是用户名格式不正确。之前指定为"mydomain\user"。我删除了域部分,错误消失了。
PS:我正在使用ServerBind身份验证。

你说得很对。我删除了域名,问题得到了解决,非常感谢。 - Kumaresan Perumal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接