【问题标题】:How to add security header to a SOAP message?如何向 SOAP 消息添加安全标头?
【发布时间】:2011-08-15 13:37:37
【问题描述】:

我正在尝试从我们的 C# 应用程序中使用我们的提供者用 Java 编写的 WebService。到了交流的时候,我得到了这个:

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

从昨天开始,我一直在尝试找出如何将安全标头添加到 SOAP 消息中。

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

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

【问题讨论】:

    标签: c# web-services security


    【解决方案1】:

    我实际上是通过使用 WSE 来实现的。有趣的是,提供者的 Web 服务不能与 WSE 3.0 一起使用,但他们可以与 WSE 2.0 一起使用。以下是步骤

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

    替换

    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 实例。

    【讨论】:

    • 那么是否可以使用 WCF 使用 Blackboard Web 服务?
    • @AdrianCarneiro - Sooper 太棒了!
    • 每次有人更新网络引用时,引用都会被清除(我需要再次将其润湿到 microsoft.web.services2)。有没有办法阻止这种情况发生?
    • @AdrianCarneiro 哪个类是 Web 服务代理实现?我没有任何类继承自 SoapHttpClientProtocol
    • WSE 2.0 可以通过 Nuget 添加到您的项目中。 nuget.org/packages/Microsoft.Web.Services2
    【解决方案2】:

    试试这个。无需 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);
    
    // shouldn't MessageHeader be Security?
    //  MessageHeader messageHeader = MessageHeader.CreateHeader("Security", ...
    
        OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);
    
        var result = client.GetCorporations(new CorporationType { pageNo = 1 });
    }
    

    【讨论】:

    • 认为这缺少 wsse 部分中的顶级安全性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    相关资源
    最近更新 更多