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 错误