XMLでWebServiceと通信する必要があります。このサービスは、saml:アサーションを使用して接続を認証しています。私はサーバーと通信することができますが、検証は常に失敗します。私は何時間も問題を探しました。なぜなら、まったく同じパラメータとsamlチケットでsoapUIを使用すると、それが機能するからです。私は "手動で" saml:Assertionから書式を取り除こうとしましたが、これは署名されているため、1バイトの変更でもう動作しません。XmlElement.InnerXmlの書式設定なしでの使用方法
は、ここに私のコードです:
// 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" />
この現象を取り除くにはどうすればよいですか?
なぜこの形式は失敗していると仮定していますか? wiresharkやfiddlerのようなスニファを使って、soapUIのレスポンスとアプリケーションのレスポンスを比較してください。あなたはアプリケーションをsoapUIのように見せます。最初のリクエストを比較し、C#コードを変更して開始し、ヘッダーがsoapUIと同じになるようにします。 – jdweng
これは書式設定でなければなりません。 soapUIと私のC#コードのリクエストは、単一のタグを閉じる(/>)前のスペースを除いて全く同じヘッダとボディを持っています。 –
ヘッダーと本文が同じ場合、何を書式設定と呼んでいますか?最初の応答は同じですか?どちらもhttp 1.0を使用していますか?あなたは200のステータスを取得していますか?私は、データがまったく同じであればタイミング問題になると思うでしょう。 httpはトランスポート層としてtcpを使用しており、tcp切断が可能です。私はそうは思わない。同時に2つの接続を同時に開いているように、サーバーは2番目の接続を許可していません。 – jdweng