【发布时间】:2015-07-28 22:02:46
【问题描述】:
我正在实施 SAML 2.0 node.js 身份提供程序。作为概念证明,我想表明该服务可供 .net 消费者或服务提供者使用。我正在使用node-samlp 库。我遇到的问题是 xml SAMLResponse 由 npm 包签名,我正在尝试使用 .net Web 应用程序验证 xml 签名。验证失败...
这是我为身份提供者服务而编写的 javascript:
function postSuccess(req,res,next,userId){
return ms.call('ms.ip.claims.getClaims').then(function(claims){
return samlp.auth({
cert: fs.readFileSync('c:\\temp\\test.pem').toString(),
key: fs.readFileSync('c:\\temp\\test.key').toString(),
signatureAlgorithm: 'rsa-sha1',
digestAlgorithm:'sha1',
getPostURL: function(wtrealm,wreply,req,callback){
callback(null,req.samlRequest.AssertionConsumerServiceURL);
},
profileMapper: profileMapper,
issuer: '<my-company>'
})(req,res,next);
});
}
这会生成 SAMLResponse 并将其成功发送回我的 .net Web 应用程序,但我在尝试验证 xml 文件的签名时遇到了问题。
这是.net端的验证码:
public bool IsValid(XmlDocument xmlDoc)
{
var cert = new X509Certificate2();
cert.Import("c:\\temp\\test.pfx", "password", X509KeyStorageFlags.DefaultKeySet);
var manager = new XmlNamespaceManager(xmlDoc.NameTable);
manager.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl);
var nodeList = xmlDoc.SelectNodes("//ds:Signature", manager);
var signedXml = new SignedXml(xmlDoc);
signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NWithCommentsTransformUrl;
signedXml.LoadXml((XmlElement)nodeList[0]);
return signedXml.CheckSignature(cert, true);
}
节点端使用的 pem 和密钥是从 .net 端使用的 pfx 证书生成的。我没有收到任何错误消息,只是signedXml.CheckSignature(cert,true) 的错误结果。
任何建议都将不胜感激。
【问题讨论】:
-
也许开启数字签名追踪会给你一些线索? social.msdn.microsoft.com/Forums/en-US/…
-
@explunit 谢谢,我会调查的。
-
您确定您没有使用以下语句修改已签名的 xml。signedXml.SignedInfo.CanonicalizationMethod = signedXml.XmlDsigExcC14NWithCommentsTransformUrl;此行不是必需的,可能会破坏签名。
-
@sk_ 这是可能的,但我在多次失败后补充说。您在此处看到的代码是经过 2 天的调整以试图通过验证。
标签: javascript c# node.js saml-2.0 xml-signature