使用allowInsecureTransport = true的WCF服务绑定会导致客户端中的更新服务引用失败

时间:2010-09-18 20:02:18

标签: .net wcf exception-handling wcf-security wcf-configuration

这是我在web.config中的服务配置:

<binding name="statefulSessionWithUsernameOverTransport">
  <security authenticationMode="SecureConversation"
    requireSecurityContextCancellation="False" allowInsecureTransport="True">
    <secureConversationBootstrap authenticationMode="UserNameOverTransport"/>
  </security>
  <binaryMessageEncoding />
  <httpTransport />
</binding>

<service name="com.example.FooService"
  behaviorConfiguration="usernamePasswordAuthBehavior">
  <endpoint contract="com.example.FooService.IFooService"
    address="custom" binding="customBinding"
    bindingConfiguration="statefulSessionWithUsernameOverTransport" />
</service>

我设置allowInsecureTransport = True,因为在生产中,服务将在SSL终止负载均衡器后面运行。从我的.Net 4.0客户端调用服务没有任何问题,但尝试更新VS2010中的服务引用总是会导致错误:

  

System.ServiceModel.Channels.TransportSecurityBindingElement   错误:安全策略导出失败。 Binding包含TransportSecurityBindingElement但没有实现ITransportTokenAssertionProvider的传输安全绑定元素。不支持此类策略导出的策略导出。*

我理解它试图告诉我的内容 - 基本上我已经禁用了绑定上的传输安全性,这要求它避免损害通过线路传输的凭据。但是 - 这就是 allowInsecureTransport 的重点。可能是代理生成器根本不知道这个属性吗?

更新

看起来wsdl生成器确实无法处理该属性。我不得不回到消息级安全性和自签名证书进行开发。使用Message Security的优势在于能够坚持使用Cassini进行开发而不是完全成熟的IIS。

<wsHttpBinding>
    <binding name="wshttpDevelopmentBinding">
      <security mode="Message">
        <message clientCredentialType="UserName" />
      </security>
    </binding>
</wsHttpBinding>

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。问题似乎是http传输,因为它没有实现ITransportTokenAssertionProvider接口,但https确实如此。我能够绕过这两种方式:切换我的自定义绑定以使用https传输,实现接口,并将enableUnsecuredResponse =“true”添加到配置中的安全元素,或者编写从HttpTransportBindingElement派生的自定义绑定,但实现必要的界面。

答案 1 :(得分:1)

我读过这几次(例如herehere),但我从未尝试过。它看起来像是WSDL导出中的一个错误,因为当您手动配置服务和客户端时,它应该可以工作,但元数据导出不起作用。第二个链接提出了一些解决方法,但它是丑陋的。

我的建议是将allowInsecureTransport设置为false并使用测试证书进行HTTPS开发,并在部署应用程序时切换此配置(可以是安装包的一部分)。

答案 2 :(得分:0)

我遇到了类似的问题。我在客户端计算机上安装了.NET framework 3.5的热修复程序,之后就可以了。