【问题标题】:How to get the LDAP OU of the user using node / passport?如何使用节点/护照获取用户的 LDAP OU?
【发布时间】:2018-01-22 01:35:26
【问题描述】:

我正在我的 Node.js 应用程序中处理 LDAP 身份验证/授权流程,并且需要检索给定用户所属的 OU。

以下代码让我获得了用户,但是当我检查它时,我看不到 OU:

var express = require('express'),
    passport = require('passport'),
    bodyParser = require('body-parser'),
    LdapStrategy = require('passport-ldapauth');

var opts = {
    server: {
        url: 'ldap://ldap.forumsys.com:389',             // Host + port
        bindDn: 'cn=read-only-admin,dc=example,dc=com',  // user DN
        bindCredentials: 'password',                     // Password
        searchBase: 'dc=example,dc=com',                 // Base DN
        searchFilter: '(uid={{username}})'
    }
};

var app = express();

passport.use(new LdapStrategy(opts, function(user, done){
    done(null, user);
}));

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) {
    var ou = req.user.distinguishedName;
    res.send({status: 'Hello ' + req.user.uid});
});

app.listen(8998);

鉴于此代码,检索 OU 的正确方法是什么?

【问题讨论】:

  • 您可以尝试将includeRaw: true 添加到 opts.server。这应该获取接收到的原始数据。希望也有OU。我没有 LDAP 服务器来测试和验证
  • 谢谢塔伦。我试过了,但 OU/组也不是原始的。
  • 您可以尝试另一个属性groupSearchAttributes: ["all"]。看看有没有帮助
  • 还是差不多。得到了 cn、dn,但没有 OU
  • 尝试全部更改为ou。实际上需要调试源,但我无权访问 AD 服务器

标签: node.js passport.js ldap-query


【解决方案1】:

问题在于 LDAP 服务器,而不是您的代码。如果针对 Active Directory 服务器运行,您的代码将返回对象的完整路径。

我针对您的在线测试服务器和 AD 服务器进行了测试。

forumsys 站点上的 cmets 看来,要获取 OU,您需要自己查询 OU 对象以查找成员。我认为这在大多数 LDAP 设置中不是标准的。

在这个特定的 LDAP 设置中,OU 的类型为 groupOfUniqueNames。 因此,组中的成员资格由 每个 OU 中存在的 uniqueMember 属性。确定一个 用户的 OU 成员资格,您必须扫描每个 OU 并找到 包含您正在查找的用户的 DN 的 uniqueMember 属性 为。

如果您想自己查看此内容,请使用 Apache Directory Studio 和上面提供的信息以查看设置。

【讨论】:

    【解决方案2】:

    您可以使用在查询中提供特定用户 DN 的 member、memberof 或 distinctName 搜索条件来检索 OU,这应该可以解决此问题。

    来自您的代码:

    用户的 DN 是:

    cn=read-only-admin,dc=example,dc=com
    

    因此,您的搜索过滤器可以是 memeber=user's DN 或 distinctName=user's DN:

    searchFilter: '(member = {{cn=read-only-admin,dc=example,dc=com}})'
    
    searchFilter: '(distingushedName = {{cn=read-only-admin,dc=example,dc=com}})'
    

    没有用于测试代码的 LDAP AD,但这应该可以。

    【讨论】:

      猜你喜欢
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 2017-02-03
      • 2021-07-25
      • 1970-01-01
      相关资源
      最近更新 更多