我正在编写一个使用WSHttpFederationBinding发布端点的C#WCF服务。我们有自己的安全令牌服务器提供令牌,呼叫者需要使用自定义绑定。
对于我编写的C#客户端来说,这一切都运行正常:这在app.config中有一个自定义绑定,如下所示:
<bindings>
<customBinding>
<binding name="CustBind">
<security authenticationMode="UserNameForCertificate" requireDerivedKeys="true"
messageProtectionOrder="SignBeforeEncryptAndEncryptSignature"
requireSecurityContextCancellation="false"
requireSignatureConfirmation="false">
<secureConversationBootstrap/>
</security>
<httpTransport/>
</binding>
</customBinding>
<wsFederationHttpBinding>
<binding name="FedBind">
<security>
<message issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1"
negotiateServiceCredential="false">
<issuer address="http://STSHost/MySTS" binding="customBinding"
bindingConfiguration="CustBind">
<identity>
<certificateReference x509FindType="FindBySubjectName" findValue="localhost"/>
</identity>
</issuer>
</message>
</security>
</binding>
</wsFederationHttpBinding>
</bindings>
然而,我想要的是让用户能够以他们想要的任何语言生成自己的客户端,只需给出WCF服务发布的WSDL。这个问题是当我使用Developer Studio的“添加服务引用”功能尝试这样的事情时,生成的客户端不起作用。
它不起作用的原因是因为生成的客户端的app.config明显错误:当STS在“issuer”元素中时,没有自定义绑定的迹象。看看WSDL,这并不太令人惊讶,因为除了发行人地址之外,没有任何其他内容。
有没有办法让WCF向WSDL添加一些内容来描述这种情况?我的服务器的app.config绑定看起来没问题:“issuer”元素与工作客户端完全相同,包括自定义绑定的地址和详细信息。有谁知道为什么WCF在生成WSDL时似乎忽略了这一点?