如何通过反向代理将NTLM认证用户信息传递至Next.js/Express.js
可行实现方案及技术选型
方案一:反向代理传递认证请求头
IIS配置步骤
- 在IIS站点启用Windows身份验证(NTLM/SSPI),完成前端用户认证。
- 安装ARR(Application Request Routing)模块,配置反向代理规则,将请求转发到Next.js/Express.js的服务端口。
- 添加IIS出站规则:创建自定义HTTP请求头(如
X-Authenticated-User),将IIS内置变量{REMOTE_USER}的值写入该头,传递已认证的用户名。 - 后端读取逻辑:
- Express.js:通过
req.headers['x-authenticated-user']获取用户名 - Next.js:在API路由或
getServerSideProps中读取req.headers['x-authenticated-user']
- Express.js:通过
Nginx配置步骤
- 配置Nginx集成Windows域认证(可借助
nginx-auth-ldap模块对接AD,或使用第三方认证组件完成NTLM/SSPI认证)。 - 在反向代理配置中添加:
proxy_set_header X-Authenticated-User $remote_user; - 后端读取逻辑同IIS方案。
方案二:Node.js直接处理NTLM/SSPI认证
无需依赖反向代理,直接在Node.js层完成认证:
- 适用npm包:
express-ntlm、sspi(原生SSPI绑定) - Express.js示例代码:
const express = require('express'); const ntlm = require('express-ntlm'); const app = express(); app.use(ntlm({ domain: '你的域名称', domaincontroller: 'ldap://你的域控制器地址', })); app.get('/', (req, res) => { res.send(`已认证用户:${req.ntlm.UserName},域:${req.ntlm.DomainName}`); }); app.listen(3000); - 注意:需确保Node.js服务器部署在域环境内,客户端可直接发起NTLM协商请求。
方案三:Kerberos认证集成
若域环境支持Kerberos,可采用更高效的Kerberos认证方案:
- 反向代理(IIS/Nginx)完成Kerberos认证后,通过自定义请求头(如
X-Forwarded-User)传递用户名。 - Node.js端可选使用
kerberos包对票据进行二次校验,或直接读取请求头信息。
- 优势:相比NTLM性能更优,跨域场景支持更好。
方案四:SPNEGO票据传递
利用SPNEGO封装NTLM/Kerberos认证流程:
- 在反向代理(如IIS)启用SPNEGO认证,完成用户身份校验。
- 配置反向代理将SPNEGO票据通过自定义请求头(如
X-Auth-Token)传递到Node.js后端。 - Node.js使用
spnego包解析票据,提取用户信息。
内容的提问来源于stack exchange,提问作者Rune
相关产品推荐
相关产品推荐

