3

我需要在我的消息中添加如下内容:

  <soap:Header>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soap:mustUnderstand="1">
      <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="unt_Z1k4LnxEmBzzKuPP">
        <wsse:Username>user</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
        <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">iNs+LF1iwwPU2AMer8uU6NKY9tfzgYqMTaP3mIEgoK0=</wsse:Nonce>
        <wsu:Created>2012-04-22T11:57:30Z</wsu:Created>
      </wsse:UsernameToken>
      <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsu:Created>2012-04-22T11:57:30Z</wsu:Created>
        <wsu:Expires>2012-04-22T11:58:30Z</wsu:Expires>
      </wsu:Timestamp>
    </wsse:Security>
  </soap:Header>

我正在调用一个返回 500 错误响应的 Web 服务,这基本上意味着它无法进行身份验证我猜是因为我从消息中丢失了这些信息,即使我在消息上有一个身份验证标头。这会发生吗?

如何在消息中添加 WS-Security 标头并在代码中添加所有这些信息?我在 Visual Studio 中使用 Add Web Reference 添加了该服务。

谢谢你。

4

1 回答 1

2

最优雅的解决方案是一个过时的解决方案,涉及制作我用来从 .NET 3.5 调用到 .NET 2.0 的类库、安装 WSE 3.0、侵入一些 VS 配置文件以使加载项工作并启用类库项目作为启用 WSE 的项目。

Update Web Reference 制作了两个代理类(例如 Myservice 和 MyServiceWse)。一个继承自 SoapHttpClient,这是 WCF 代理生成的默认设置,最新继承自 WebServicesClientProtocol。

最新的是您需要使用 WS-Security 标头调用旧的 ASMX Web 服务。

剩下的就这么简单:

MyServiceWse client = new MyServiceWse();

        UsernameToken token = new UsernameToken(userName, password, PasswordOption.SendPlainText); // or what service specs rquired, other than plaintext.

        client.RequestSoapContext.Security.Tokens.Add(token);
        client.RequestSoapContext.Security.Timestamp.TtlInSeconds = 60;

        client.YourMethod(); 

对于 VS 2005 之后不包含 Microsoft 的过时 API 来说非常简单,您需要在序列化之前、序列化之后、使用扩展和其他东西之前使用 Stream 和字符串操作来捕获消息……

如果您对此有解决方案,使用 Add Reference 而不是旧的 Add Web Reference 和 WSE 使用 WS-Security 标头、UsernameToken、TimeStamp Created、Expired 等进行简单调用。

请告诉我。

PS找到这个问题的解决方案并通过一些有用的链接回答。

在 C# 中使用具有标头安全性的非 asmx SOAP 1.1 Web 服务

于 2012-04-24T08:25:32.647 回答