我正在尝试使用WCF客户端来调用第三方Web服务。 Web服务使用用户名令牌身份验证WSS-Security 1.0 Soap Message Security
以下是Web服务所需内容的示例soap身份验证标头
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<wsse:Security soap:mustUnderstand="1">
<wsse:UsernameToken namespaces>
<wsse:Username>username</wsse:Username>
<wsse:Password Type="type info">password</wsse:Password>
<wsse:Nonce>nonce</wsse:Nonce>
<wsu:Created>date created</wsu:Created>
</wsse:UsernameToken>
<wsse:Security>
</soap:Header>
<soap:Body>
<WebServiceMethodName xmlns="Web Service Namespace" />
我按照以下方式配置客户端
<basicHttpBinding>
<binding name="Binding1">
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="Basic"/>
</security>
</basicHttpBinding>
但收到一条错误,指出标题中缺少nonce和datecreated属性。有谁知道如何配置WCF客户端以使用
WSS-Security 1.0肥皂消息安全用户名令牌认证?
答案 0 :(得分:3)
我遇到了同样的问题。我使用MessageInspector
代替自定义令牌serlializer在UsernameToken
方法中添加了正确的BeforeSendRequest
。然后我使用自定义行为来应用修复。
我的博文demo project中记录了整个过程(Supporting the WS-I Basic Profile Password Digest in a WCF client proxy}。或者,您可以阅读PDF。
如果您想跟进我的进度到解决方案,您可以在StackOverflow上找到标题为“Error in WCF client consuming Axis 2 web service with WS-Security UsernameToken PasswordDigest authentication scheme”:
答案 1 :(得分:1)
一直在看同样的问题,我的发现很遗憾,WCF不支持Nonce值。
如果要发送用户名和密码(默认包含时间戳),请将配置更改为
<basicHttpBinding>
<binding name="BasicHTTP">
<!-- UsernameToken over Transport Security -->
<security mode="TransportWithMessageCredential">
<message clientCredentialType ="UserName" />
</security>
</binding>
</basicHttpBinding>
还要注意,在WCF和WSS4J之间交换时,UserNameToken似乎是一个缺陷(至少对标准有不同的解释),请参阅http://social.msdn.microsoft.com/Forums/en/wcf/thread/6bc1b0e4-424b-4e2a-909c-815095be631f
WSSConfig.getDefaultWSConfig()setAllowNamespaceQualifiedPasswordTypes(真)。可能是WSS4J方面的解决方法。
更新:在WCF方面,你可以通过实现CustomCredential和CustomTokenSerializer参考最后一篇文章解决问题 http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/4df3354f-0627-42d9-b5fb-6e880b60f8ee
沃尔维克