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);
我不知道到底是什么导致了这个错误。
对我来说,当我像这样设置主要部分时,问题就解决了:
env.put(Context.SECURITY_PRINCIPAL, userId@domainWithoutProtocolAndPortNo);
您可以在实例化时传递的环境哈希表中设置它
javax.naming.ldap.InitialLdapContext
即 context = new InitialLdapContext(env, null);
,其中 env 是一个哈希表。
就我而言,我必须使用
<username>@<domain>
之类的东西才能成功登录。
sample_user@sample_domain
52e 1326 ERROR_LOGON_FAILURE
当用户名有效但密码/凭据无效时返回。将防止显示大多数其他错误,如所述。
https://ldapwiki.com/wiki/Wiki.jsp?page=Common%20Active%20Directory%20Bind%20Errors
当您使用 Context.SECURITY_AUTHENTICATION 作为“简单”时,您需要提供 userPrincipalName 属性值 (user@domain_base)。
在 CAS 上使用 AD 时,我遇到了类似的问题,即 52e 错误,在我的例子中,应用程序接受 CN= 形式的全名,而不是实际的用户名。
例如,如果您有一个全名是 Ross Butler 的用户,其登录用户名是 rbutler - 您通常会输入类似 cn=rbutler,ou=Users,dc=domain,dc=com 的内容,但我们每次都失败。通过将其更改为 cn=Ross Butler,ou=Users,dc=domain,dc=com 它通过了!!
对我来说,通过在用户名中添加域名来解决问题,如下所示:
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”
对我来说,问题的原因是用户名的格式不正确。它之前被指定为“mydomain\user”。我删除了域部分,错误就消失了。
PS 我正在使用 ServerBind 身份验证。
我测试了三种不同的方法,它们都有效:
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。不然不行。
LDAP 在将事务发送到另一个服务器数据库时尝试使用 AD 进行身份验证。此身份验证失败,因为用户最近更改了密码,尽管此交易是使用以前的凭据生成的。此身份验证将一直失败,直到...除非您将事务状态更改为“完成”或“取消”,在这种情况下,LDAP 将停止发送这些事务。
对我来说,问题是通过像这样更改环境来解决的:
env.put("LDAP_BASEDN", base)
env.put(Context.SECURITY_PRINCIPAL,"user@domain")
使用域名可能可以解决问题(使用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();
}
就我而言,我错误配置了电子邮件凭据,然后我更正了
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);
});
}));
};
请从用户名“mydomain\user”中删除域。请仅输入“用户”。不要输入域名和反斜杠。
您不使用 ldaps://examplehost:8080(不要将 s 与 ldaps 一起使用,因为需要证书),使用 ldap://examplehost:8080,然后使用 非 TLS 端口号。它对我有用。