我在第三方的WCF服务上遇到了一些身份验证问题。我不知道它是如何配置的,它对我来说就像一个黑盒子。我所知道的唯一的事情就是那些web服务应该使用基本身份验证,但可能不会。
我添加了fiddler,甚至wireshark来分析这些请求中发生的事情,并发现带有authorization
标头的请求会得到身份验证。所以基本上,使用SoapUI我能够在那些WCF服务上进行身份验证。
我使用svcutil
生成了一个测试客户端,并指定了如下配置文件:
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_1" useDefaultWebProxy="false" >
<security mode="Message" >
<message clientCredentialType="UserName" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://theurl.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_1"
contract="CA_TestMediaSaturn.IDCIntegration" name="BasicHttpBinding_2" />
</client>
我还在代码文件中向客户端添加了授权信息:
client.ClientCredentials.UserName.UserName = "one";
client.ClientCredentials.UserName.Password = "two";
但是我无法在base64中获得编码的Authorization
标头。
我想知道如何配置我的客户端以获取这些标头,以便在Web服务端获得授权。我确实发现了article描述了如何自己制作它。但也许有办法让它变得容易多了?
更新1:
我只是来自第三方供应商的接收器服务配置设置。它可以以某种方式帮助找出错误的原因。
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_1" >
<security mode="TransportCredentialOnly">
<message clientCredentialType="UserName"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
答案 0 :(得分:2)
你应该设置mode =“Transport”而不是“Message”。这将生成Authorization标头。当前设置是消息安全性,因此身份验证在SOAP中。
编辑:好像你需要预先认证。 一般来说,wcf将首先不发送授权标头,如果服务返回一个挑战,那么它将再次发送带有标头的消息。某些服务器不支持此挑战机制,并且需要在第一次拍摄时发送授权标头。这在.net 2中称为预身份验证。不幸的是,wcf不支持它。但你可以自己做:首先将安全模式设置为None,这样WCF根本不会发送安全性。然后查看example here如何自己将此标题添加到wcf调用。