使用BasicHttpBinding和Authorization标头在WCF服务上进行身份验证

时间:2013-08-29 13:02:05

标签: wcf authentication header client basic-authentication

我在第三方的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>

1 个答案:

答案 0 :(得分:2)

你应该设置mode =“Transport”而不是“Message”。这将生成Authorization标头。当前设置是消息安全性,因此身份验证在SOAP中。

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