0

我在节点/快递中间件中使用 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)。护照网站上的文档很少。

非常感谢任何帮助。

4

1 回答 1

0

对于遇到相同问题的任何人,我都想通了。最后没有太多。

  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)。

于 2022-01-24T19:50:14.243 回答