0

我在第三方 WCF 服务的身份验证方面遇到了一些问题。我不知道它是如何配置的,它对我来说就像一个黑匣子。我唯一知道的是,那些网络服务应该使用基本身份验证,但可能不会。

我添加了提琴手,甚至是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";

但我无法将这些Authorization标头编码为 base64。我想知道如何配置我的客户端以获取这些标头以便在 web 服务端获得授权。我确实找到了一篇描述如何自己制作的文章。但也许有一种方法可以让它变得更容易?

更新 1:

我刚刚从第 3 方供应商处接收服务配置设置。Mb 它可以以某种方式帮助找出错误的原因。

 <bindings>
 <basicHttpBinding>
 <binding name="BasicHttpBinding_1" >
                 <security mode="TransportCredentialOnly">
                   <message clientCredentialType="UserName"/>
                 </security>
               </binding>
 </basicHttpBinding>
 </bindings>
4

1 回答 1

3

你应该设置 mode="Transport" 而不是 "Message"。这将生成授权标头。当前设置是消息安全,因此身份验证在 SOAP 内部。

编辑:好像你需要预认证。一般来说,wcf 将首先不发送授权标头,如果服务返回一个挑战,那么它将再次发送带有标头的消息。一些服务器不支持这种挑战机制,并且需要在第一时间发送授权标头。这在 .net 2 中称为预身份验证。不幸的是 wcf 不支持它。但你可以自己做:首先将安全模式设置为无,这样 WCF 根本不会发送安全性。然后在此处查看示例如何自己将此标头添加到 wcf 调用中。

于 2013-08-29T14:35:44.273 回答