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

Authentication LDAP:错误代码49-80090308:LDAPPER:DSID-0C09003A9,注释:AcceptSecurityContext错误,数据52e,v1db1,authentication,ldap,Authentication,Ldap,LDAP:错误代码49-80090308:LDAPPER:DSID-0C09003A9,注释:AcceptSecurityContext错误,数据52e,v1db1 我知道“52e”代码是用户名有效时的代码,但密码无效。我在ApacheStudio中使用了相同的用户名和密码,我成功地建立了到LDAP的连接 这是我的java代码 String userName = "*******"; String password = "********"; String base ="

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

我知道“52e”代码是用户名有效时的代码,但密码无效。我在ApacheStudio中使用了相同的用户名和密码,我成功地建立了到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=newinitialdircontext(env)

我不知道到底是什么导致了这个错误

数据52e-

你可能需要像这样的东西

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

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


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

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

在将事务发送到另一个服务器DB时,LDAP正在尝试使用AD进行身份验证。此身份验证失败,因为用户最近更改了密码,尽管此事务是使用以前的凭据生成的。此身份验证将一直失败,直到。。。除非您将事务状态更改为“完成”或“取消”,否则LDAP将停止发送这些事务。

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


例如,如果您有一个全名为Ross Butler的用户,并且他们的登录用户名为rbutler,那么您通常会输入这样的内容,cn=rbutler,ou=Users,dc=domain,dc=com,但我们的每次都失败。通过将其更改为cn=rossbutler,ou=Users,dc=domain,dc=com,它就通过了

在我的情况下,我必须使用类似
@
的东西才能成功登录


示例_user@sample_domain

当您使用Context.SECURITY\u身份验证作为“简单”时,您需要提供userPrincipalName属性值(user@domain_base).

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

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

如果您调试并确定ctx=null,可能您的用户名有问题,您应该这样写
“ac\管理员”(双“\”)或administrator@ac“

通过如下方式更改环境,可以解决我的问题:

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

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

Hashtable env=new Hashtable();
String principalName=“域名\\用户名”;
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
env.put(Context.PROVIDER\u URL,“ldap://URL:389/OU=ou-xx,DC=fr,DC=XXXXXX,DC=com”);
环境put(Context.SECURITY_认证,“simple”);
环境保护(Context.SECURITY_PRINCIPAL,principalName);
env.put(Context.SECURITY_凭证,“您的密码”);
试一试{
DirContext authContext=新的初始DirContext(env);
//用户已通过身份验证
System.out.println(“用户已授权”);
}捕获(AuthenticationException ex){
//身份验证失败
System.out.println(“身份验证失败:+ex”);
}捕获(NamingException-ex){
例如printStackTrace();
}

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


PS我正在使用ServerBind身份验证。

您应该找到一种更好的查找用户的方法:@sbmc7您在实例化javax.naming.ldap.InitialLdapContext时在传递的环境哈希表中设置了这个值,即context=new InitialLdapContext(env,null);其中env是一个哈希表。谢谢你的帖子,我尝试了所有我能想到的CN、OU和DC的不同组合,但是这个方法是唯一适合我的方法!我曾经userID@DC1.DC2yes,@Vishal,这对我也有用。我在网上搜了搜真倒霉,直到我找到了你的答案。我真的很感激。谢谢你,就这样吧!请解释一下您的解决方案,并相应地编辑您的问题。有关更多提示,请参见“是否需要解释为什么使用域是解决方案?”我认为有些LDAP需要域。如果我们只传递用户名,服务器将不接受。可视化AD期望的语法的一种方法是使用“属性编辑器”选项卡,如中所述。如果你向下滚动到“cn”,你可能会找到答案。
    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();
    }