我有一个客户用户名/密码验证器。是否足以将它放在web.config中的端点bindingConfiguration属性中,或者我是否需要在Service方法中显式调用它。我注意到当我不称它为Service操作时,它不会被调用。我做错了吗?
这就是我定义绑定部分的方式:
<bindings>
<wsHttpBinding>
<binding name="CustomAuthentication">
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
这就是我定义服务节点的方式:
<service behaviorConfiguration="CustomValidator" name="Test.TestService">
我的端点属性有BindingConfiguration =“CustomAuthentication”
这就是我在ServiceBehaviors中定义的行为:
<behavior name="CustomValidator">
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="Test.CustomUserNameValidator, FuzionSync"/>
<serviceCertificate findValue="MyWebSite" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
</serviceCredentials>
<serviceMetadata httpGetEnabled="True"/>
</behavior>
当我运行wcf测试客户端来调用服务调用时,它甚至不会调用Validate方法。我得到它的唯一方法是将它放在一个明确调用的操作中。
答案 0 :(得分:3)
您需要在绑定配置和服务行为中指定此项。这就是它在我们的一个项目中的表现(重要的部分是clientCredentialType="UserName"
和<serviceCredentials>
元素):
<bindings>
<wsHttpBinding>
<binding name="SSLWithCustomAuthentication">
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" proxyCredentialType="None" />
<message clientCredentialType="UserName"
negotiateServiceCredential="true"
algorithmSuite="Default" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="customAuthenticationBehavior">
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="Namespace.YourValidator, AssemblyName"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
然后让您的服务使用behaviorConfiguration="customAuthenticationBehavior"
。
请注意,我认为WCF不允许您在没有SSL的情况下使用UserName身份验证。