Kap*_*íko 5 c# wcf ws-security soap web-services
我正在努力处理WCF绑定配置。我添加了第三方服务作为我的项目的参考。我得到了一些规格。
我需要使用,SOAP v1.2所以我想我需要WSHttpBinding它,https所以我需要SecurityMode.Transport
像这样的东西:
var binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Transport;
var client = new MyClient(binding, addr);
var result = client.Method(new MyObject());
Run Code Online (Sandbox Code Playgroud)
它会产生此请求正文。
var binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Transport;
var client = new MyClient(binding, addr);
var result = client.Method(new MyObject());
Run Code Online (Sandbox Code Playgroud)
根据我提供的规范,我需要在标头中包含和Security元素。正是我想要得到的和UsernameTokenTimestampBasicHttpBindingBasicHttpSecurityMode.TransportWithMessageCredential
当我尝试使用请求正文设置TransportWithMessageCredential模式时WSHttpBinding,请求正文会发生巨大变化。
binding.Security.Mode = SecurityMode.TransportWithMessageCredential;
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
var client = new MyClient(binding, addr);
client.ClientCredentials.UserName.UserName = "username";
client.ClientCredentials.UserName.Password = "123456";
var result = client.Method(new MyObject());
Run Code Online (Sandbox Code Playgroud)
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<S:Header>
<wsa:MessageID>
uuid:6B29FC40-CA47-1067-B31D-00DD010662DA
</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>example</wsa:Address>
</wsa:ReplyTo>
<wsa:To>example</wsa:To>
<wsa:Action>example</wsa:Action>
</S:Header>
<S:Body>
<MyObject>...</MyObject>
</S:Body>
</S:Envelope>
Run Code Online (Sandbox Code Playgroud)
现在我的安全部分是正确的,但所有寻址部分和正文都是错误的。我应该怎么办?
我期待(并且我需要)这样的事情:
binding.Security.Mode = SecurityMode.TransportWithMessageCredential;
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
var client = new MyClient(binding, addr);
client.ClientCredentials.UserName.UserName = "username";
client.ClientCredentials.UserName.Password = "123456";
var result = client.Method(new MyObject());
Run Code Online (Sandbox Code Playgroud)
您发布的第二个数据包不是 WCF 调用请求,而是安全通道设置的一部分。这是RequestSecurityToken将用 应答的数据包RequestSecurityTokenResponse。之后,如果通道设置正确,将发送与您在第一个片段中发布的相同的方法调用数据包。您可以在服务跟踪查看器中看到此数据包序列:
您想要解决的实际问题是什么?您的 WCF 调用失败吗?如果是这样,请提供异常详细信息。最可能的原因是 WCF 配置或身份验证错误。
如果您努力避免这些协商数据包,请检查此答案,该答案显示如何切换SecurityMode到Message并将NegotiateServiceCredential选项设置为false。
更新:
这部分与问题更新相关,要求修复请求的寻址部分。
要手动设置 wsa:ReplyTo 标头,您需要设置OperationContext.OutgoingMessageHeaders的ReplyTo属性,如下所示:
using (new OperationContextScope(client.InnerChannel))
{
OperationContext.Current.OutgoingMessageHeaders.ReplyTo = new EndpointAddress("http://someclient/callback");
var request = client.Method(new MyObject());
}
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅此答案。
| 归档时间: |
|
| 查看次数: |
1844 次 |
| 最近记录: |