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

问题描述 投票:0回答:15

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
15个回答
42
投票

data 52e - 当用户名有效但密码/凭证无效时返回。

你可能需要类似的东西

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

36
投票

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

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

您可以在实例化时传递的环境哈希表中设置它

javax.naming.ldap.InitialLdapContext
context = new InitialLdapContext(env, null);
,其中 env 是一个哈希表。


18
投票

就我而言,我必须使用

<username>@<domain>
之类的东西才能成功登录。

sample_user@sample_domain


18
投票

52e    1326    ERROR_LOGON_FAILURE
当用户名有效但密码/凭据无效时返回。将防止显示大多数其他错误,如所述。

https://ldapwiki.com/wiki/Wiki.jsp?page=Common%20Active%20Directory%20Bind%20Errors


14
投票

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


8
投票

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

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


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@ac”


2
投票

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

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


2
投票

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

env.put(Context.SECURITY_PRINCIPAL, "user");
env.put(Context.SECURITY_PRINCIPAL, "[email protected]");
env.put(Context.SECURITY_PRINCIPAL, "CN=user,OU=one,OU=two,DC=domain,DC=com");

如果您使用最后一个,请不要忘记设置用户所属的所有 OU。不然不行。


1
投票

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


1
投票

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

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

1
投票

使用域名可能可以解决问题(使用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();
    }

0
投票

就我而言,我错误配置了电子邮件凭据,然后我更正了

var passport = require('passport'),
    WindowsStrategy = require('passport-windowsauth'),
    User = require('mongoose').model('User');

module.exports = function () {
    passport.use(new WindowsStrategy({ldap: {
        url:            'ldap://corp.company.com:389/DC=corp,DC=company,DC=com',
        base:           'DC=corp,DC=company,DC=com',
        bindDN:         '[email protected]',
        bindCredentials:'password',
        tlsOptions: {
            ca: [fs.readFileSync("./cert.pem")],
          },
    }, integrated: false},
    function(profile, done) {
        console.log('Windows');
        console.log(profile);
        User.findOrCreate({
            username: profile.id
        }, function(err, user) {
            if (err) {
                return done(err);
            }

            if (!user) {
                return done(null, false, {
                    message: 'Unknown user'
                });
            }

            if (!user.authenticate(password)) {
                return done(null, false, {
                    message: 'Invalid password'
                });
            }

            return done(null, user);
        });
    }));
};

-1
投票

请从用户名“mydomain\user”中删除域。请仅输入“用户”。不要输入域名和反斜杠。

您不使用 ldaps://examplehost:8080(不要将 s 与 ldaps 一起使用,因为需要证书),使用 ldap://examplehost:8080,然后使用 非 TLS 端口号。它对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.