要解决"Active Directory SSO认证导致每个请求都会打开一个新标签页"的问题,您可以使用以下代码示例:
// 设置单点登录(SSO)认证模式
app.set('trust proxy', true);
app.use(expressSession({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true,
cookie: {
secure: true,
sameSite: 'none'
},
proxy: true,
name: 'sso-cookie'
}));
// 处理登录请求
app.get('/login', passport.authenticate('saml', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
}));
// 处理认证回调
app.post('/login/callback', passport.authenticate('saml', {
failureRedirect: '/login',
failureFlash: true
}), function(req, res) {
res.redirect('/');
});
// 处理每个请求之前的中间件
app.use(function(req, res, next) {
if (req.isAuthenticated()) {
// 用户已经通过SSO认证
next();
} else if (req.originalUrl.startsWith('/login/callback')) {
// 避免循环重定向
next();
} else {
// 重定向到登录页面进行认证
res.redirect('/login');
}
});
上述代码使用Express框架和Passport中间件来处理Active Directory的SSO认证。其中,app.set('trust proxy', true);
用于信任代理服务器,app.use(expressSession)
用于设置会话配置,passport.authenticate('saml')
用于处理登录请求和认证回调。
在每个请求之前的中间件中,使用req.isAuthenticated()
来检查用户是否通过SSO认证。如果已认证,继续处理请求,否则重定向到登录页面进行认证。
请注意,上述代码只是一个示例,并且需要根据您的具体环境和要求进行适当调整。此外,您还需要安装相关的Passport和SAML相关的依赖模块,并配置Passport的SAML策略以与您的Active Directory进行集成。