我構建了一個WCF客戶端來訪問供應商Web服務。該服務使用IssuedTokenOverTransport,SymmetricKey,並且期望SAML。我的請求正在工作,但服務的響應包括WS-Security頭中的SignatureConfirmation元素。我的C#客戶端扼流器在這個「簽名確認不希望在安全頭」,我沒有看到任何方式來忽略或處理這個元素。似乎在WCF中處理SignatureConfirmation的唯一方法是放棄IssuedTokenOverTransport綁定並使用其他內容,但這似乎不是一種選擇,因爲該服務需要此綁定類型。這是WCF中的錯誤嗎?IssuedTokenOverTransport響應中的意外SignatureConfirmation
1
A
回答
1
我通過使用自定義消息編碼器解決了這個問題。請參閱本文從卡洛斯Figueroa的背景:
http://blogs.msdn.com/b/carlosfigueira/archive/2011/11/09/wcf-extensibility-message-encoders.aspx
基本上,編碼器可以查找SignatureConfirmation元件輸入消息中並從頭部卸下。代碼的關鍵部分是這一點,從ReadMessage覆蓋稱爲私有方法:
private MemoryStream ProcessMemoryStream(Stream inputStream, bool dispose)
{
StreamWriter xmlStream = null;
var outputStream = new MemoryStream();
bool continueFilter = false;
try
{
xmlStream = new StreamWriter(outputStream);
using (var reader = XmlReader.Create(inputStream))
{
using (
var writer = XmlWriter.Create(xmlStream,
new XmlWriterSettings() {ConformanceLevel = ConformanceLevel.Auto}))
{
while (reader.Read())
{
if (reader.LocalName.Equals("SignatureConfirmation") &&
reader.NamespaceURI.Equals(
"http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd"))
{
if (!reader.IsEmptyElement) continueFilter = reader.IsStartElement();
}
else if (reader.LocalName.Equals("Signature") &&
reader.NamespaceURI.Equals("http://www.w3.org/2000/09/xmldsig#"))
{
if (!reader.IsEmptyElement) continueFilter = reader.IsStartElement();
}
else if (continueFilter)
{
// continue to next node
}
else
XmlHelper.WriteShallowNode(reader, writer);
}
writer.Flush();
}
reader.Close();
}
outputStream.Position = 0;
return outputStream;
}
catch (Exception ex)
{
// handle error
throw;
}
finally
{
if (xmlStream != null && dispose) xmlStream.Dispose();
}
}
在XML助手:
internal static class XmlHelper
{
internal static void WriteShallowNode(XmlReader reader, XmlWriter writer)
{
if (reader == null)
{
throw new ArgumentNullException("reader");
}
if (writer == null)
{
throw new ArgumentNullException("writer");
}
switch (reader.NodeType)
{
case XmlNodeType.Element:
writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
writer.WriteAttributes(reader, true);
if (reader.IsEmptyElement)
{
writer.WriteEndElement();
}
break;
case XmlNodeType.Text:
writer.WriteString(reader.Value);
break;
case XmlNodeType.Whitespace:
case XmlNodeType.SignificantWhitespace:
writer.WriteWhitespace(reader.Value);
break;
case XmlNodeType.CDATA:
writer.WriteCData(reader.Value);
break;
case XmlNodeType.EntityReference:
writer.WriteEntityRef(reader.Name);
break;
case XmlNodeType.XmlDeclaration:
case XmlNodeType.ProcessingInstruction:
writer.WriteProcessingInstruction(reader.Name, reader.Value);
break;
case XmlNodeType.DocumentType:
writer.WriteDocType(reader.Name, reader.GetAttribute("PUBLIC"), reader.GetAttribute("SYSTEM"),
reader.Value);
break;
case XmlNodeType.Comment:
writer.WriteComment(reader.Value);
break;
case XmlNodeType.EndElement:
writer.WriteFullEndElement();
break;
}
}
}
相關問題
- 1. 意外的響應代碼(..)
- 2. Sketch插件中NSFileManager的意外響應
- 3. LabVIEW中Zaber設備的意外響應
- 4. Jboss的意外的HTTP響應:500
- 5. 意外的響應代碼:502 nginx的
- 6. 錯誤響應json:意外的令牌「:」
- 7. 意外的服務器響應(400)
- 8. BasicNetwork.performRequest:意外的響應代碼429(android)
- 9. BasicNetwork.performRequest:意外的響應代碼500
- 10. 意外的響應代碼426
- 11. ksoap2 Android意外類型的響應
- 12. 意外的響應代碼400?
- 13. 意外的響應代碼500
- 14. Volley ClientError意外的響應代碼404
- 15. 蟒imaplib意外的響應220
- 16. AutoBahn/Twisted「意外的響應代碼200」
- 17. 意外的HTTP狀態500響應
- 18. BasicNetwork.performRequest:意外的響應代碼401
- 19. BasicNetwork.performRequest:意外的響應代碼422
- 20. Android Volley意外的響應代碼400
- 21. BasicNetwork.performRequest:意外的響應碼503
- 22. 意外空白的Ajax響應文本
- 23. SignalR意外的響應代碼:500
- 24. Consul-Template意外的響應代碼:504
- 25. 錯誤:意外響應代碼:403
- 26. 錯誤:意外響應代碼:200
- 27. Android Volley BasicNetwork.performRequest()意外響應代碼404
- 28. 意外元素:CDATA在驗證響應
- 29. 錯誤:意外響應代碼:500
- 30. 錯誤:意外響應代碼:302
運行到同樣的事情在這裏......幾乎一模一樣。 –