NodeJS 使用Express的Active Directory验证错误,js

j0pj023g  于 2023-04-29  发布在  Node.js
关注(0)|答案(1)|浏览(230)

我正在使用activedirectory模块对AD用户进行身份验证。我对大多数用户都没有遇到问题,但是对于某个特定OU中的用户,身份验证经常失败。下面是我使用的代码

.env

ldap_url = "ldap://mydomain.local"
baseDN = "DC=mydomain, DC=local"
ad_bind_user = "bind-user@mydomain.local"
ad_bind_user_password = "Password Placeholder"

login.js

const express = require('express');
    const ActiveDirectory = require('activedirectory');
    const router = express.Router();

    const config = {
      url: process.env.ldap_url,
      baseDN: process.env.baseDN,
      username: process.env.ad_bind_user,
      password: process.env.ad_bind_user_password
    };

    const ad = new ActiveDirectory(config);

    router.post('/api/login', (req, res) => {
    const username = req.body.username;
    const password = req.body.password;

    ad.authenticate(username, password, (error, auth) => {
        if (error) {
            return res.status(500).send(error);
        }
        if (auth) {
            req.session.user = { 
                username: username,
                authenticated: true
            };
            return res.json(req.session.user);
        }
        else {
            return res.status(401).send('Unauthorized User');
        }
    });
});

对于特定Users OU以外的用户,我能够成功进行身份验证。但是,对于Users OU中的帐户,身份验证失败,并出现以下错误

{
    "lde_message":"80090308: LdapErr: DSID-0C09044E, comment: AcceptSecurityContext error, data 52e, v2580",
    "lde_dn": null
}

对于此OU中的用户,如果我为域提供了用户名,我就能够成功进行身份验证。e.当用户名是testuser时,它不工作,但当用户名是testuser@mydomain时。在本地,它工作正常。
我还创建了另一个路由来获取用户详细信息,并且对于任何参数i,输出都没有任何差异。两个OU中的用户具有完全相同的参数
下面是我用来获取用户详细信息的代码

router.get('/api/getusers', (req, res) => {
    const username = req.body.username;

    ad.findUser(username, (error, auth) => {
        if (error) {
            return res.status(500).send(error);
        }
        if (auth) {
            return res.json(auth);
        }
    });
});

我似乎不明白为什么代码只期望域用于身份验证函数中的特定OU,而不需要域就可以成功地用findUser函数找到用户?我该怎么办?

t3irkdon

t3irkdon1#

我不能过去的原因,只有身份验证功能有问题查找用户没有域。所以我修改了login。js将域添加到username变量(不是最优雅的,但它很有效)。这是修改后的脚本。

const express = require('express');
const ActiveDirectory = require('activedirectory');
const router = express.Router();

const config = {
  url: process.env.ldap_url,
  baseDN: process.env.baseDN,
  username: process.env.ad_bind_user,
  password: process.env.ad_bind_user_password
};

const ad = new ActiveDirectory(config);

router.post('/api/login', (req, res) => {
const username = req.body.username;
const password = req.body.password;

ad.authenticate(username + '@mydomain.local', password, (error, auth) => {
    if (error) {
        return res.status(500).send(error);
    }
    if (auth) {
        req.session.user = { 
            username: username,
            authenticated: true
        };
        return res.json(req.session.user);
    }
    else {
        return res.status(401).send('Unauthorized User');
    }
});
});

相关问题