在企业级的 Web 应用开发中,实现基于 AD 域的登录验证是一项常见需求,这能让员工使用公司统一的 AD 域账号登录应用,提升安全性与管理效率。接下来,我们就详细聊聊如何用 Node.js 的 Express 框架对接 AD 域认证,实现 Web 应用基于 AD 域的登录验证,同时完成 Session 持久化配置。

一、应用场景分析

在大型企业里,员工众多,管理员工账号是个头疼的事儿。要是每个应用都单独设置账号密码,不仅员工记起来麻烦,管理员维护也费劲。这时候,AD 域就派上用场了。AD 域就像是一个大管家,统一管理员工的账号信息。Web 应用对接 AD 域认证后,员工用 AD 域账号就能登录各个应用,方便又安全。

比如说,一家跨国公司有多个部门,每个部门都有自己的业务系统。通过 AD 域认证,员工只需一个账号,就能在不同的业务系统间自由切换,大大提高了工作效率。而且,管理员在 AD 域里对账号进行统一管理,比如添加新员工账号、修改权限、删除离职员工账号等,操作简单又高效。

二、技术优缺点

优点

  1. 安全性高:AD 域本身有一套完善的安全机制,如账号锁定、密码复杂度要求等。Web 应用对接 AD 域认证后,能借助这些机制提升自身的安全性。
  2. 管理方便:企业管理员可以在 AD 域中集中管理用户账号和权限,无需在每个应用中单独设置。
  3. 用户体验好:用户只需记住一个 AD 域账号和密码,就能登录多个应用,减少了记忆负担。

缺点

  1. 部署复杂:AD 域的部署和配置相对复杂,需要专业的技术人员进行操作。
  2. 依赖 AD 域服务器:如果 AD 域服务器出现故障,可能会影响用户登录应用。

三、实现步骤

1. 环境准备

首先,我们要确保已经安装了 Node.js 和 npm。然后创建一个新的项目目录,并初始化项目:

# 创建项目目录
mkdir ad-auth-example
# 进入项目目录
cd ad-auth-example
# 初始化项目
npm init -y

接着,安装必要的依赖包:

# 安装 Express 框架
npm install express
# 安装 LDAP 客户端,用于与 AD 域服务器通信
npm install ldapjs
# 安装 express-session 用于管理 Session
npm install express-session
# 安装 connect-redis 用于 Session 持久化到 Redis
npm install connect-redis
# 安装 redis 客户端
npm install redis

这里使用的技术栈是 Node.js 和 Express 框架。

2. 配置 Express 应用

创建一个 app.js 文件,编写以下代码:

const express = require('express');
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
const redis = require('redis');

// 创建 Express 应用实例
const app = express();
// 解析表单数据
app.use(express.urlencoded({ extended: true }));

// 配置 Redis 客户端
const redisClient = redis.createClient({
  host: 'localhost',
  port: 6379
});

// 配置 Session
app.use(session({
  store: new RedisStore({ client: redisClient }),
  secret: 'your-secret-key',
  resave: false,
  saveUninitialized: false
}));

// 定义登录页面路由
app.get('/login', (req, res) => {
  res.send(`
    <form action="/login" method="post">
      <input type="text" name="username" placeholder="Username">
      <input type="password" name="password" placeholder="Password">
      <button type="submit">Login</button>
    </form>
  `);
});

// 启动服务器
const port = 3000;
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

3. 实现 AD 域认证

app.js 中继续添加代码,实现 AD 域认证逻辑:

const ldap = require('ldapjs');

// 定义 AD 域服务器信息
const adServer = 'ldap://your-ad-server:389';
const baseDN = 'dc=yourdomain,dc=com';

// 处理登录表单提交
app.post('/login', (req, res) => {
  const username = req.body.username;
  const password = req.body.password;

  // 创建 LDAP 客户端
  const client = ldap.createClient({
    url: adServer
  });

  // 构造用户 DN
  const userDN = `cn=${username},${baseDN}`;

  // 尝试绑定用户
  client.bind(userDN, password, (err) => {
    if (err) {
      console.error('Authentication failed:', err);
      res.send('Authentication failed');
      client.unbind();
      return;
    }

    // 认证成功,设置 Session
    req.session.user = username;
    res.send('Authentication successful');
    client.unbind();
  });
});

4. Session 持久化配置

在上面的代码中,我们已经使用 connect-redis 将 Session 持久化到 Redis。这样,即使服务器重启,用户的 Session 信息也不会丢失。

5. 保护路由

为了确保只有认证用户才能访问某些页面,我们可以创建一个中间件来检查用户是否已经登录:

// 中间件:检查用户是否已登录
const isAuthenticated = (req, res, next) => {
  if (req.session.user) {
    next();
  } else {
    res.redirect('/login');
  }
};

// 受保护的路由
app.get('/protected', isAuthenticated, (req, res) => {
  res.send(`Welcome, ${req.session.user}! This is a protected page.`);
});

四、注意事项

  1. AD 域服务器配置:确保 AD 域服务器的地址、端口和基础 DN 配置正确,否则会导致认证失败。
  2. 安全问题:在生产环境中,要使用 HTTPS 协议来保护用户的登录信息,避免信息泄露。
  3. Session 管理:合理设置 Session 的过期时间,避免 Session 长时间保留导致安全风险。

五、文章总结

通过 Node.js 的 Express 框架对接 AD 域认证,我们可以实现 Web 应用基于 AD 域的登录验证,并通过 Redis 实现 Session 持久化。这种方式不仅提高了应用的安全性和管理效率,还提升了用户体验。在实际应用中,我们要注意 AD 域服务器的配置、安全问题和 Session 管理等方面,确保系统的稳定运行。