如何在saml/回调期间验证护照SAML策略的验证回调中的断言?

问题描述 投票:0回答:1

这是我从 Passport-saml 文档中获得的示例代码。我不想检查电子邮件 ID,而是想验证 saml 断言,这反过来又表明用户也在 idp 上进行了身份验证,对吧?任何帮助是极大的赞赏。谢谢...

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

passport.use(
  new SamlStrategy(
    {
      path: "/login/callback",
      entryPoint:
        "https://openidp.feide.no/simplesaml/saml2/idp/SSOService.php",
      issuer: "passport-saml",
      cert: "fake cert", // cert must be provided
    },
    function (profile, done) {
      // for signon
      findByEmail(profile.email, function (err, user) {
        if (err) {
          return done(err);
        }
        return done(null, user);
      });
    },
    function (profile, done) {
      // for logout
      findByNameID(profile.nameID, function (err, user) {
        if (err) {
          return done(err);
        }
        return done(null, user);
      });
    }
  )
);

我从一些来源发现了这一点,这是实现要求的正确发现吗?

const SamlStrategy = require('passport-saml').Strategy;
const xmlCrypto = require('xml-crypto');
const xmlDom = require('xmldom');

passport.use(new SamlStrategy({
  // SAML strategy configuration
}, function(profile, done) {
  // Validate SAML signature
  const isValidSignature = validateSamlSignature(profile);

  if (!isValidSignature) {
    return done(new Error('Invalid SAML signature'));
  }

  // Continue with other verification logic and user creation
  // ...

  if (authenticationIsSuccessful) {
    // User is authenticated
    const user = /* Construct user object based on SAML attributes */;
    done(null, user);
  } else {
    // User authentication failed
    done(new Error('User authentication failed'));
  }
}));

function validateSamlSignature(profile) {
  const signature = profile.getAssertionXml().getElementsByTagNameNS("http://www.w3.org/2000/09/xmldsig#", "Signature")[0];
  const xml = profile.getSamlResponseXml();

  const sig = new xmlCrypto.SignedXml();
  sig.keyInfoProvider = {
    getKeyInfo: function (key) {
      return "<X509Data></X509Data>";
    },
    getKey: function (keyInfo) {
      // Implement key retrieval logic based on your configuration
      // For example, load IdP's public key from a file or configuration
      const publicKey = '-----BEGIN CERTIFICATE-----\n... (IdP's public key) ...\n-----END CERTIFICATE-----';
      return publicKey;
    }
  };

  sig.loadSignature(signature.toString());
  return sig.checkSignature(xml);
}

node.js saml passport-saml
1个回答
0
投票

@node-saml/passport-saml 在验证调用期间代表您验证签名(在处理 IdP 通过前端通道 HTTP POST 绑定传递的 SAML autnresponse 期间)。 IE。在调用回调函数之前,签名已经过验证。

  1. https://github.com/node-saml/passport-saml/blob/v4.0.4/src/strategy.ts#L60
  2. https://github.com/node-saml/passport-saml/blob/v4.0.4/src/strategy.ts#L178
  3. https://github.com/node-saml/node-saml/blob/v4.0.5/src/saml.ts#L667-L823
  4. 如果签名在其他检查中正确,它(passport-saml)会将控制权移交给您的回调函数https://github.com/node-saml/passport-saml/blob/v4.0.4/src/策略.ts#L152-L156

如果您是 SAML 2.0 的新手,请考虑在生产中使用它之前对其进行研究,因为它有许多陷阱,并根据这些文档中的信息评估 SAML 库的功能,以确定这些/您的选择是否满足要求(例如,passport-saml 缺乏XML 模式验证,这将是额外的安全层,并且缺乏强制的收件人验证,这意味着它不符合规范)。这里有一些很好的文档:

  1. OASIS 安全断言标记语言 (SAML) V2.0 的断言和协议 OASIS 标准,2005 年 3 月 15 日 https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf
  2. OASIS 安全断言标记语言 (SAML) V2.0 的配置文件 OASIS 标准,2005 年 3 月 15 日 https://docs.oasis-open.org/security/saml/v2.0/saml-profiles-2.0-os.pdf
  3. OASIS 安全断言标记语言 (SAML) V2.0 的安全和隐私注意事项 OASIS 标准,2005 年 3 月 15 日 https://docs.oasis-open.org/security/saml/v2.0/saml-sec-consider-2.0-os.pdf
  4. OASIS 安全断言标记语言 (SAML) 2.0 的元数据 OASIS 标准,2005 年 3 月 15 日 https://docs.oasis-open.org/security/saml/v2.0/saml-metadata-2.0-os.pdf
  5. 还有这个:https://cheatsheetseries.owasp.org/cheatsheets/SAML_Security_Cheat_Sheet.html
© www.soinside.com 2019 - 2024. All rights reserved.