1

我正在尝试在这样的BeforeSendRequest方法中修改自定义标头并将其添加到肥皂消息中:

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
    {
        MessageHeader header = MessageHeader.CreateHeader("name", "http://myname", "Oscar");
        request.Headers.Add(header);

        return null;
    }

此时一切正常,标题添加到soap标题中,如下所示:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<ActivityId CorrelationId="51efbfdb-2187-45b9-81fc-6a38815d5bed" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">d1351a78-a53a-4d32-ad35-fca6d4262adf</ActivityId>
<name xmlns="http://myname">Oscar</name>
</s:Header>

问题是我想在标题中添加更大的东西,最终结果必须是这样的:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<ActivityId CorrelationId="51efbfdb-2187-45b9-81fc-6a38815d5bed" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">d1351a78-a53a-4d32-ad35-fca6d4262adf</ActivityId>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <wsse:UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsse:Username xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">username</wsse:Username>
      <wsse:Password xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">password</wsse:Password>
    </wsse:UsernameToken>
</wsse:Security>
</s:Header>

有没有办法做到这一点?

PS。请大家:-)不要批评我,我处于以下情况:

添加此用户名和密码身份验证时,您需要结束https,问题是我尝试通信的这个基于 Java 的 Web 服务处于下http,我认为它不符合要求,因为根据第三个链接“这被认为是不好的做法通过不安全的连接传递凭据”,但他们解决了它在配置文件中添加标题(我没有成功)。

我也阅读了这些链接并尝试了它们。同样,当从链接 1 和 2 执行操作时,我在 Visual Studio 中遇到了一种异常,上面写着“应该是 https 而不是 http”,这就是我尝试MessageInspectors使用BeforeSendRequest方法的原因。

  1. 使用通过 https 的用户名为 WS-Security 配置 WCF

  2. http://www.west-wind.com/weblog/posts/2007/Dec/09/Tracing-WCF-Messages

  3. http://www.fransson.net/blog/credentials-over-plain-http-with-wcf/

4

3 回答 3

1

ClearUsernameBinding是解决方案

于 2012-05-16T12:30:59.067 回答
0

CreateHeader 的第三个参数是一个对象。默认情况下,此对象使用 DataContractSerializer 进行序列化,因此如果您创建一个对标头结构建模的数据协定,您可以将实例作为第三个参数传递,它将创建您想要的标头

于 2012-05-16T02:33:56.137 回答
0

我有同样的问题,虽然我的服务是 https。这应该是一个配置问题,您不需要手动处理。

无论如何,您不必通过 BeforeSendRequest 使用 MessageInspectors。您应该尝试更改配置生成的代码,添加一些安全配置。然后,WCF 将创建您需要的标头。然后在代码中添加凭据,你应该没问题。

我想生成的代理正在为您创建 customBinding 或 basicHttpBinding。basicHttpBinding 虽然不支持 WS-Security 规范,但您应该将其更改为自定义或 wsHttpBinding。您可以使用并找到正确的配置以获得所需的结果。

我添加的是“示例配置语法”:

<customBinding>
        <binding name="MessageServerBinding">
          <security defaultAlgorithmSuite="Default" authenticationMode="UserNameOverTransport"
            requireDerivedKeys="true" includeTimestamp="true" messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
            <secureConversationBootstrap />
          </security>
........
</binding>
</customBinding>

这是一个示例配置,例如,您可能不需要包含时间戳,或者您可能需要一个 Nonce,如果我没记错的话需要更多的努力,但不多。

检查此讨论:WCF:将 Nonce 添加到 UsernameToken

希望这可以帮助。

于 2012-05-16T06:37:19.823 回答