You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用passport-saml实现Azure AD的SAML单点登出功能

passport-saml对接Azure AD SAML单点登出实现方案

1. 配置项对应关系说明

  • passport-saml配置里的logoutUrl:填Azure AD提供的SAML登出端点,可从Azure AD企业应用的「单一登录」->「SAML配置」模块获取,格式通常为https://login.microsoftonline.com/<租户ID>/saml2,是后端发起登出请求时调用的Azure侧接口地址。
  • Azure后台配置的「前端登出URL」:对应passport-saml配置里的logoutCallbackUrl,是Azure AD完成登出流程后跳转回应用的回调地址,需要提前添加到Azure AD应用的重定向URI列表中,类型选择Web。

2. 补充passport-saml策略配置

在原有SAML策略配置基础上新增登出相关参数:

const SamlStrategy = require('passport-saml').Strategy;

passport.use(new SamlStrategy({
  // 原有登录配置保持不变:entryPoint、issuer、callbackUrl、cert等
  // 新增登出配置
  logoutUrl: 'https://login.microsoftonline.com/<替换为你的Azure租户ID>/saml2',
  logoutCallbackUrl: 'https://<替换为你的应用域名>/logout/callback',
  issuer: '<替换为你的应用实体ID,和登录配置保持一致>'
}, (profile, done) => {
  // 原有用户信息校验逻辑保持不变
}));

3. /movelogout登出触发路由实现

用户点击登出时调用该路由,先销毁应用本地会话,再生成Azure AD登出请求跳转:

app.get('/movelogout', (req, res, next) => {
  if (!req.user) {
    return res.redirect('/');
  }
  // 销毁本地会话
  req.session.destroy(err => {
    if (err) return next(err);
    req.logout(err => {
      if (err) return next(err);
      // 生成Azure AD登出重定向地址
      passport._strategy('saml').logout({
        user: {
          nameID: req.user.nameID,
          nameIDFormat: req.user.nameIDFormat
        }
      }, (err, requestUrl) => {
        if (err) return next(err);
        res.redirect(requestUrl);
      });
    });
  });
});

4. 登出回调路由实现

Azure AD完成登出后会跳转至该地址,处理后续跳转逻辑:

// 路由地址和passport配置的logoutCallbackUrl、Azure后台填的前端登出URL完全一致
app.get('/logout/callback', (req, res) => {
  // 可选:校验返回的SAML请求签名合法性
  res.redirect('/login?logout=success');
});

注意事项

  • 所有涉及的回调地址必须保证协议、域名、路径完全匹配,否则Azure AD会拒绝登出请求
  • 如果需要支持跨应用单点登出(其他关联应用登出时Azure主动通知本应用销毁会话),可额外新增POST类型的登出回调路由,接收Azure推送的SAML登出请求后销毁对应用户会话即可

内容的提问来源于stack exchange,提问作者Rajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:57:00