You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET与Ping Federate的SAML签名验证互操作性问题排查

解决.NET验证Ping Federate SAML签名失败的方案

核心问题定位

Ping Federate基于org.apache.santuario.xmlsec生成的SAML签名中,<ds:SignatureValue>节点内含&#13;转义字符(回车符),虽符合XML规范但违反Base64编码规则,导致.NET的SignedXml及手动验证流程均失败。

分步解决方案

1. 预处理XML,清理SignatureValue中的非法字符

加载XML后先定位<ds:SignatureValue>节点,移除其中的&#13;转义字符及多余空白(Base64仅允许指定字符集,此类回车符属于非法内容):

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load(pathToXml);

// 初始化命名空间管理器处理ds前缀
XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable);
nsManager.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#");

// 获取并清理SignatureValue节点内容
XmlElement signatureValueNode = (XmlElement)xmlDoc.SelectSingleNode("//ds:SignatureValue", nsManager);
if (signatureValueNode != null)
{
    // XmlDocument会自动将&#13;解析为\r,直接移除即可
    string cleanValue = signatureValueNode.InnerText
        .Replace("\r", "")
        .Replace("\n", "")
        .Trim();
    signatureValueNode.InnerText = cleanValue;
}

2. 执行标准SignedXml验证流程

完成清理后,再使用SignedXml进行签名验证:

SignedXml signedXml = new SignedXml(xmlDoc);
XmlNodeList nodeList = xmlDoc.GetElementsByTagName("ds:Signature");
signedXml.LoadXml((XmlElement)nodeList[0]);
bool isValid = signedXml.CheckSignature();

3. 修正手动验证逻辑(可选)

若需手动验证签名,确保使用清理后的SignatureValue内容:

// 提取清理后的签名文本
string cleanSignatureText = signatureValueNode.InnerText;
byte[] signatureBytes = Convert.FromBase64String(cleanSignatureText);

// 加载证书并执行验证
X509Certificate2 verifyingCert = new X509Certificate2(certFilePath);
using (RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)verifyingCert.PublicKey.Key)
{
    bool isValid = rsa.VerifyHash(digestBytes, CryptoConfig.MapNameToOID("SHA256"), signatureBytes);
}

额外注意事项

  • 仅允许修改<ds:SignatureValue>节点内容,严禁改动<ds:SignedInfo>等其他签名相关节点,否则会破坏签名完整性。
  • 若Ping Federate支持配置,可尝试关闭org.apache.santuario.xmlsec默认添加回车符的行为,从根源避免此类问题。

内容的提问来源于stack exchange,提问作者npen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:08:10