【问题标题】:Failed LDAP authentication using passport-ldapauth on Node.js在 Node.js 上使用 passport-ldapauth 进行 LDAP 身份验证失败
【发布时间】:2020-02-01 22:08:09
【问题描述】:

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

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

以下是我采取的步骤:

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

  2. 然后我尝试搭建一个简单的nodejs应用(代码如下)。

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

  4. 我相信我可以通过我的邮递员调用来访问节点应用程序,因为我能够使用 Apache Studio 中存在的用户名和密码获得“未经授权”的响应。但是节点应用程序无法与 Apache Directory Studio 设置的 Ldap 服务器一起工作/连接,因为我可以将节点代码中的服务器字段更改为与 ldap 服务器完全不同但仍然能够在邮递员中获得未经授权的响应. 我可能对 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:389',
    bindDN: 'cn=admin,ou=users,dc=contoso,dc=com',
    bindCredentials: 'P@ss1W0Rd!',
    searchBase: 'ou=users,dc=contoso,dc=com',
    searchFilter: '(uid={{Username}})'
  },
  credentialsLookup: basicAuth
  // ,
  // usernameField: user,
  // passwordField: pass
};

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);


这是我一直在尝试验证的用户:


dn: cn=Aaron Painter,ou=users,dc=contoso,dc=com
objectClass: top
objectClass: posixAccount
objectClass: organizationalPerson
objectClass: person
objectClass: inetOrgPerson
cn: Aaron Painter
gidNumber: 70051
homeDirectory: /home/aaronp
sn: Painter
uid: aaronp
uidNumber: 70050
displayName: Aaron Painter
givenName: Aaron
mail: aaronp@contoso.com
manager: cn=Christine Koch,ou=users,dc=contoso,dc=com
telephoneNumber: (212) 555-8335
title: Strategy Consulting Manager
userPassword: AAA

这是我使用的邮递员电话: postman call

这是服务器中显示的日志:

contosoOpenLdap | 5d9b8107 conn=1062 fd=19 ACCEPT from IP=172.17.0.1:47712 (IP=0.0.0.0:389)
contosoOpenLdap | 5d9b8107 conn=1063 fd=20 ACCEPT from IP=172.17.0.1:47714 (IP=0.0.0.0:389)
contosoOpenLdap | 5d9b8107 conn=1063 op=0 BIND dn="cn=admin,ou=users,dc=contoso,dc=com" method=128
contosoOpenLdap | 5d9b8107 conn=1063 op=0 RESULT tag=97 err=49 text=
contosoOpenLdap | 5d9b8107 conn=1063 op=1 UNBIND
contosoOpenLdap | 5d9b8107 conn=1063 fd=20 closed

错误代码 49 表示 DN 或密码不正确。但配置对我来说似乎是正确的。

请帮忙谢谢。

【问题讨论】:

    标签: node.js authentication ldap passport.js apache-directory


    【解决方案1】:

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

    • 搜索过滤器语法错误,您不应该在其中传递密码
    • searchBase 使用完整的 dn(不是 rdn)
    • 要么通过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。使用以下正文 { "user": "test", "pass": "test" },您将设置:

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

    但是,如果您更喜欢通过授权标头设置凭据,那么您可以使用 credentialsLookup 和所需的身份验证类型,并在 Postman 的 Authorization 选项卡中进行设置。

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

    【讨论】:

    • 嗨,埃里克,非常感谢您的回复。我试过你的方法,但没有奏效。我已经更新了我的帖子以包含更多详细信息。基本上我目前的理解是我可以创建 ldap 服务器并在 Apache Directory Studio 中添加所有用户。然后编写一个与 ldap 服务器配置相同的简单节点应用程序。使用邮递员发送身份验证请求,我应该能够得到授权结果。如果我错了,请纠正我。
    • 没错。我编辑了我的答案,以便您可以走得更远,但使用示例用户条目和日志会更容易。
    • 您好,Eric 再次感谢您的快速回复。我已经做出了改变,虽然我没有做对,但我认为我已经接近了。我已经包含了有关我正在尝试做的事情的更多详细信息。从日志看来,它似乎在抱怨错误的 dn 或凭证,但我不知道如何解决它。有任何想法吗?我真的很感激。
    • 是的,这意味着您的绑定凭据错误.. 我建议您先使用[ldapsearch](https://linux.die.net/man/1/ldapsearch) 命令测试您的 ldap 设置,获得正确的设置会更快 - 这适用于每次使用LDAP 发挥作用的情况 - 尽管没有人能猜出您的凭据,但您需要深入研究 slapd 配置,搜索 rootdnrootpw。无论如何,这不会改变答案,如果您觉得它有帮助,请考虑支持/接受它,谢谢。
    • 这是测试设置的方法,目标 1. 是测试绑定并检索条目以进行身份​​验证:ldapsearch -x -D cn=admin,ou=users,dc=contoso,dc=com -W -b ou=users,dc=contoso,dc=com "(&amp;(cn=Aaron Painter)(objectClass=person))"
    猜你喜欢
    • 2018-01-29
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多