我需要通过XML与Web服务通信。该服务正在使用saml:断言来验证连接。我可以与服务器通信,但验证总是失败。我花了几个小时搜索了问题所在,因为当我使用参数完全相同的soapUI和saml票据时,它可以工作。我试图“手动”删除saml:Assertion中的任何格式,因为它是经过签名的,所以只要更改一个字节,它就不再有效了。
这是我的代码:
// Insert saml:Assertion string into soapenv:Header
private static void InsertSAML(ref XmlDocument soapXML, ref XmlNamespaceManager nsmgr, string saml)
{
// Remove all formatting
saml = saml.Replace("\r", "");
saml = saml.Replace("\n", "");
while(saml.IndexOf(" ") > -1)
{
saml = saml.Replace(" ", " ");
}
saml = saml.Replace("> <", "><");
saml = saml.Replace("\" />", "\"/>");
XmlElement soapHeader = (XmlElement)soapXML.SelectSingleNode("//soapenv:Envelope/soapenv:Header/wsse:Security", nsmgr);
if (soapHeader == null)
{
throw new Exception("Can't find \"//soapenv:Envelope/soapenv:Header/wsse:Security\"");
}
soapHeader.InnerXml += saml;
}
soapHeader.InnerXml += saml;
所以,我需要补充一点:
<dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
但在最终的XML中,即使我在插入之前替换了这些事件,也是这样:
<dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />