我在项目的两个部分中使用 ldapjs。第一个是对 Passportjs 使用 Passport-windowsauth 策略,第二个是我的身份验证功能的一部分,我在其中连接以检索用户 Angular 色。我已将事件处理程序附加到后者以捕获错误事件,但我从未触发过它。我怀疑 Passport 策略上发生了错误,但我不确定如何将事件处理程序附加到该策略。我将如何捕获策略上的错误事件?控制台日志在大约 15 分钟后显示以下内容,并且每隔几分钟无限期地重复一次。除了日志中的错误之外,实现工作完美。
LDAP connection error: { [Error: read ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
ldap.js
var ldap = require('ldapjs'),
fs = require('fs');
ldapClient = null;
exports.createClient = function() {
if(ldapClient) return ldapClient;
else {
ldapClient = ldap.createClient({
url: 'ldaps://srv01.contoso.local:636',
reconnect: true,
tlsOptions: {
rejectUnauthorized: true,
ca: [ fs.readFileSync(__dirname + '/../config/ca.pem') ]
}
});
ldapClient.bind('binduser','C0nn3ctM3', function(err) {if(err) {
console.log('Bind error: ' + err); assert.ifError(err); }
});
ldapClient.on('error', function(err) { console.log('Caught ', err.code) })
return ldapClient;
}
}
exports.destroyClient = function() {
if(!ldapClient) return true;
else {
ldapClient.unbind();
ldapClient.destroy();
return true;
}
}
passport.js
var passport = require('passport'),
mongoose = require('mongoose'),
WindowsStrategy = require('passport-windowsauth'),
User = mongoose.model('User'),
fs = require('fs');
module.exports = function() {
passport.use(new WindowsStrategy({
ldap: {
url: 'ldaps://srv01.contoso.local:636/',
base: 'DC=Contoso,DC=local',
bindDN: 'binduser',
bindCredentials: 'C0nn3ctM3',
reconnect: true,
tlsOptions: {
rejectUnauthorized: true,
ca: [ fs.readFileSync(__dirname + '/ca.pem') ]
}
},
integrated: false
}, function(profile, done) {
if(!profile) { console.log('Error: Cannot retrieve profile. Bad password?'); }
else {
User.findOne({'userName': profile._json.sAMAccountName}, function(err, user) {
if(user) {
done(null, user);
}
else {
var newuser = new User();
newuser.getRoles(profile._json.sAMAccountName).then(function(userRoles) {
var account = {
userName: profile._json.sAMAccountName,
firstName: profile._json.givenName,
lastName: profile._json.sn,
emailAddress: profile._json.mail,
roles: userRoles
};
User.create(account, function (err, user) {
if(err) {
if(err.toString().indexOf('E11000') > -1) {
err = new Error('Duplicate username');
}
}
done(null, user);
});
});
}
});
}
}));
passport.serializeUser(function(user, done) {
if(user) {
done(null, user.userName);
}
});
passport.deserializeUser(function(id, done) {
User.findOne({'userName': id}).exec(function(err, user) {
if(user) {
return done(null, user);
}
else {
return done(null, false);
}
})
});
}
更新 我最终在 Passport-windowsauth 文件 LdapLookup.js 中找到了导致重复控制台垃圾邮件的行并对其进行了修改。我现在仍然想知道如何将事件处理程序附加到策略或替代解决方案是什么。
最佳答案
也许回复已经太晚了,但为了其他读者的缘故,我添加了此回复。
闲置一段时间后,重置与 LDAP 服务的连接时,会发生 ECONNRESET 错误。这是一个常见问题,因为无法维持与 LDAP 的长时间连接。我最近也遇到这个问题了。
有多种方法可以解决这个问题。
- 将重新连接选项设置为 true。我发现你已经做到了 b
- 下一个选项是在发生 ERRCONNRESET 时销毁客户端并重新创建。您已经实现了销毁客户端并每次都重新创建它。
您还可以找到此 link其中讨论这个问题很详细。
关于javascript - ldapjs - LDAP 连接错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41446941/