如何将安全头添加到SOAP消息?

时间:2011-04-29 14:43:10

标签: c# web-services security

我正在尝试使用我们的提供商从C#App中使用Java编写的WebService。什么时候沟通,我明白了:

  

WSDoAllReceiver:传入消息不包含必需的安全标头

从昨天开始,我正在尝试了解如何将安全标头添加到SOAP消息中。

是的,我读过这篇文章(Clueless about how to create SOAP <wsse:Security> header),但它没有用。

我环顾四周,这似乎是个问题。我想知道我是否可以在这里得到一些帮助,一些指针,一些代码,让我开始。

2 个答案:

答案 0 :(得分:14)

我实际上通过使用WSE实现了这一目标。有趣的是,提供商的Web服务不适用于WSE 3.0,但他们使用WSE 2.0。以下是步骤

  • 获取WSE 2.0
  • 将Web引用添加到项目
  • 在Web Reference代理实现中:

替换

public partial class UserWS : System.Web.Services.Protocols.SoapHttpClientProtocol

通过

public partial class UserWS : Microsoft.Web.Services2.WebServicesClientProtocol
  • 在致电Web服务之前:

设置身份验证信息

UsernameToken token = new UsernameToken("user", "pwd", PasswordOption.SendPlainText);
yourProxy.RequestSoapContext.Security.Tokens.Add(token);

就是这样!仅供参考,提供者是Blackboard个实例。

答案 1 :(得分:1)

尝试一下。无需webreference和Web.Services2实施。

            var client = "Your Service Client"; 
            using (var scope = new OperationContextScope(client.InnerChannel))
            {
                System.Xml.XmlDocument document = new XmlDocument();
                XmlElement element = document.CreateElement("wsse", "UsernameToken", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");

                XmlElement newChild = null;
                newChild = document.CreateElement("wsse", "Username", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
                newChild.InnerText = "finance";
                element.AppendChild(newChild);

                newChild = document.CreateElement("wsse", "CorporationCode", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
                newChild.InnerText = "387";
                element.AppendChild(newChild);

                MessageHeader messageHeader = MessageHeader.CreateHeader("UsernameToken", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", element, false);

                OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);

                var result = client.GetCorporations(new CorporationType { pageNo = 1 });
            }