这是我在 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>