这是我在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>
答案 0 :(得分:2)
我遇到了同样的问题。问题似乎是http传输,因为它没有实现ITransportTokenAssertionProvider接口,但https确实如此。我能够绕过这两种方式:切换我的自定义绑定以使用https传输,实现接口,并将enableUnsecuredResponse =“true”添加到配置中的安全元素,或者编写从HttpTransportBindingElement派生的自定义绑定,但实现必要的界面。
答案 1 :(得分:1)
我读过这几次(例如here或here),但我从未尝试过。它看起来像是WSDL导出中的一个错误,因为当您手动配置服务和客户端时,它应该可以工作,但元数据导出不起作用。第二个链接提出了一些解决方法,但它是丑陋的。
我的建议是将allowInsecureTransport设置为false并使用测试证书进行HTTPS开发,并在部署应用程序时切换此配置(可以是安装包的一部分)。
答案 2 :(得分:0)
我遇到了类似的问题。我在客户端计算机上安装了.NET framework 3.5的热修复程序,之后就可以了。