【问题标题】:How can I implement Single Logout using Passport.js on a node / express middleware如何在节点/快速中间件上使用 Passport.js 实现单点注销
【发布时间】:2022-01-14 11:48:51
【问题描述】:

我正在使用 Passport 和 passport-saml 在节点/快递中间件中实施 SAML SSO。

定义了以下明确的用户和策略:

用户

const savedUsers = [];

passport.serializeUser((expressUser, done) => {
    done(null, expressUser);
});

passport.deserializeUser((expressUser, done) => {
    done(null, expressUser);
});

策略

const strategy = new Strategy(
    {
        entryPoint: process.env.SSO_ENTRYPOINT,
        issuer: process.env.SSO_ISSUER,
        protocol: process.env.SSO_PROTOCOL,
        logoutUrl: process.env.SSO_LOGOUT_URL,
        cert: fs.readFileSync('./.cert/saml-cert.pem', 'utf-8'),
        path: 'sso/callback'
    },
    (expressUser, done) => {
        if (!savedUsers.includes(expressUser)) {
            savedUsers.push(expressUser);
        }

        return done(null, expressUser);
    }
);

SSO 工作正常。我不知道如何让 SLO 工作。看过一些关于 SO 的例子:

strategy.logout(req, function(err, requestUrl) {
    // LOCAL logout
    req.logout();
    // redirect to the IdP with the encrypted SAML logout request
    res.redirect(requestUrl);
});

但这不起作用 - 部分原因是我不知道 requestUrl 应该是什么,其次是如何使用 Passport logoutUrl 以及我是否需要提供其他数据。 logoutUrl 是 ISP 提供的单一注销服务 URL(在我的例子中是 PingIdentity)。 护照网站上的文档很少。

非常感谢任何帮助。

【问题讨论】:

    标签: node.js single-sign-on passport.js saml passport-saml


    【解决方案1】:

    对于遇到相同问题的任何人,我都想通了。到头来也没什么大不了的。

    1. 改变策略。需要在 Strategy 对象中添加额外的注销参数:

    additionalLogoutParams: {Signature: fs.readFileSync(process.env.SSO_CERT_ONE_LINE_LOCATION, 'utf-8')},

    证书与 cert 参数中定义的 .pem 证书相同,但删除了 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 和换行符。

    1. 更改logout方法:

    strategy.logout(req, (err, request) => {
      if (err) {
        return res.redirect(`[error logout url]`);
      }
      else {
        req.session.destroy(function (err) {
          if (!err) {
              return res.redirect(request);
          } else { alert(err); }
      });
    
      }
    })

    strategy.logout 根据策略中的logoutUrl 构造注销请求,并将证书添加为查询参数。

    然后在 return res.redirect(request) 中传递它,这会将您重定向到 IDP 并销毁打开的会话。确保在您的 IDP 配置中定义一个注销回调 url - 因为这将是 IDP 通过 SAML 注销响应重定向回的 URL。

    作为 SSO 的附注 - 为了让 SSO 在 Azure 上运行,我必须确保定义了一些 cookie 设置:

    req.session.cookie.secure = true

    req.session.cookie.httpOnly = false

    req.session.cookie.sameSite = 'None'

    在本地测试时,这些标志必须以相反的方式设置。

    (还必须确保在 Azure 上的 CORS 配置中选中 Enable Access-Control-Allow-Credentials)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 2016-08-18
      • 2014-12-21
      • 2012-02-25
      • 2018-12-17
      相关资源
      最近更新 更多