使用Passport和node.js

时间:2015-08-30 06:00:03

标签: node.js authentication ldap passport.js

我有问题绑定到ldap服务器。我有以下代码:

在passport.js

module.exports = function() {
// Serialize sessions
passport.serializeUser(function(user, done) {
console.log('userid' + user.id)
    done(null, user.id);
});

// Deserialize sessions
passport.deserializeUser(function(id, done) {
    User.findOne({
        _id: id
    }, '-password', function(err, user) {
        done(err, user);
    });
});

passport.use(new LdapStrategy({
        usernameField:'username',
        passwordField:'password', 
        server: {
            url: 'ldap://xxx',
            //bindDn: 'AD\\'+'username',
            searchFilter: '(objectclass=*)',
            searchBase: 'ou=rzuser, dc=xxx, dc=xxx, dc=xxx',
        }
    },
    return done(null, user);
    }
));
};

我已使用以下代码验证了服务器端的ldap策略:

passport.authenticate('ldapauth', function(err, user, info) {

即使使用正确的用户名和密码,我也会收到以下错误:

[OperationsError: 000004DC: LdapErr: DSID-0C0906DD, comment: In order to
perform this operation a successful bind must be completed on the 
connection., data 0, v1772].

我认为问题是将正确的用户名传递给服务器。我的ldap服务器接受域名为username:domain \ username的用户名。在我的情况下,域名是" AD"。所以传递的用户名应为" AD \ username"。任何机构都可以帮我使用正确的配置将其传递给服务器吗?

1 个答案:

答案 0 :(得分:3)

bindDn(免责声明:我是作者)执行以下操作:

  1. 使用bindCredentialssearchFilter绑定到LDAP服务器(如果提供)
  2. 使用定义的searchBasebindDn
  3. 搜索此管理员连接上的用户
  4. 如果返回一个且只有一个结果,则尝试使用该结果和用户给定的密码进行绑定。
  5. 您没有传递管理员凭据,即。您尝试进行匿名搜索,如果服务器不允许匿名访问(这可能是最常见的情况),那么这可能是导致错误的原因。您应该定义bindCredentials(使用完整DN以确保安全)和bindDn。通常使用服务帐户,即。不是个人账户的东西。

    完成第3步是因为LDAP服务器通常需要完整的DN来绑定,但即使用户知道他们的DN,也不是非常方便的登录用户名。这也适用于(samaccountname={{username}}),尽管某些服务器允许使用其他形式,例如。电子邮件地址,直接。

    登录仍然会失败,除非只有一次使用,因为您的搜索过滤器将从LDAP返回每个对象,并且不会执行步骤3。您需要使用登录搜索过滤器的用户提供的用户名。例如,{{1}}将搜索用户名是用户尝试登录时提供的用户。