繁体   English   中英

在 Node.js 上使用 passport-ldapauth 进行 LDAP 身份验证失败

[英]Failed LDAP authentication using passport-ldapauth on Node.js

嗨,我是 openldap 和 nodejs 的新手。 我正在尝试创建 openldap 身份验证并使用简单的节点应用程序针对本地 ldap 服务器测试该身份验证。

我的理解是我可以创建 ldap 服务器并将所有用户添加到 Apache Directory Studio 中。 然后编写一个与 ldap 服务器相同配置的简单节点应用程序。 使用 postman 发送认证请求,应该可以得到授权结果。 如果我错了,请纠正我。

以下是我采取的步骤:

  1. 我使用 Apache Directory Studio 在本地设置了 ldap 服务器。

  2. 然后我尝试设置一个简单的 nodejs 应用程序(代码如下所示)。

  3. 当我使用 Postman 向我之前使用 Apache Directory Studio 设置的某个用户发送身份验证请求时,但我一直收到错误Unauthorized

  4. 我相信我可以使用 postman 调用来访问节点应用程序,因为我能够使用 Apache Studio 中存在的用户名和密码获得“未经授权”的响应。 But the node app is not working with / hooked up with the Ldap server set up by Apache Directory Studio, because I can change the server fields in the node code to completely different from the ldap server but still able to get the unauthorized response in postman . 我可能对 ldap 服务器没有完全了解,也许节点应用程序和 ldap 服务器是完全分开的? 或者这应该工作它只是我的代码有问题?

下面是我的节点代码。 请帮忙,谢谢。

var express      = require('express'),
    passport     = require('passport'),
    bodyParser   = require('body-parser'),
    LdapStrategy = require('passport-ldapauth'),
    basicAuth = require('basic-auth')

var OPTS = {
  server: {
    url: 'ldap://localhost:10389',
    bindDN: 'cn=admin,ou=users,dc=contoso,dc=com',
    bindCredentials: 'secret',
    searchBase: 'ou=users,dc=contoso,dc=com',
    searchFilter: '(cn={{Username}})'
  },
  credentialsLookup: basicAuth,
  usernameField: Username,
  passwordField: Password
};

var app = express();

passport.use(new LdapStrategy(OPTS));

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(passport.initialize());

app.post('/login', passport.authenticate('ldapauth', {session: false}), function(req, res) {
  res.send({status: 'ok'});
});

app.listen(8080);

有 3 件事需要解决(前提是您的凭据正确):

  • 搜索过滤器语法错误,您不应该在其中传递密码
  • searchBase使用完整的 dn(不是 rdn)
  • 您可以通过 credentialsLookup 从请求中获取credentialsLookup ,也可以设置usernameFieldpasswordField

例如,使用正确的语法保持相同的用户名属性和搜索库:

searchBase: 'ou=users,dc=contoso,dc=com',
searchFilter: '(cn={{Username}})'

这应该适用于使用以下 dn 模式对用户进行身份验证:

cn=<username>,<searchBase>  =>  cn=foo,ou=users,dc=contoso,dc=com

以上是基于您之前的配置,但如果没有更多详细信息,您仍然无法猜测用户 dn 在您的目录中的样子。 请注意,经理帐户 (bindDN) 和普通用户通常不会共享相同的 dn 模式/结构,并且您的过滤器中的用户名属性cn可能是错误的。

也就是说,在给定用户条目 dn 字符串的情况下确定 dn 结构是非常明显的,例如,如果用户名属性是uid并且用户群位于ou=people下:

dn: uid=foo,ou=people,dc=contoso,dc=com
=> searchBase: 'ou=people,dc=contoso,dc=com'
=> searchFilter: '(uid={{Username}})'

现在,如果您决定通过请求正文传递凭据,则应根据例如设置usernameFieldpasswordField 使用以下 body { "user": "test", "pass": "test" } ,您可以设置:

    //credentialsLookup: basicAuth,
    usernameField: user,
    passwordField: pass

但是,如果您更喜欢通过授权 header 设置凭据,那么您可以使用带有所需身份验证类型的credentialsLookup查找,并在 Postman 的“授权”选项卡中进行设置。

请注意,如果您同时设置了credentialsLookup和其他两个字段,则即使查找失败(没有回退可能),credentialsLookup 也会获胜。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM