这是我从 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-saml/passport-saml 在验证调用期间代表您验证签名(在处理 IdP 通过前端通道 HTTP POST 绑定传递的 SAML autnresponse 期间)。 IE。在调用回调函数之前,签名已经过验证。
如果您是 SAML 2.0 的新手,请考虑在生产中使用它之前对其进行研究,因为它有许多陷阱,并根据这些文档中的信息评估 SAML 库的功能,以确定这些/您的选择是否满足要求(例如,passport-saml 缺乏XML 模式验证,这将是额外的安全层,并且缺乏强制的收件人验证,这意味着它不符合规范)。这里有一些很好的文档: