我正在尝试将我的 WCF 服务配置为通过 HTTP 和我的 ASP.NET 开发服务器使用自定义用户名验证器。以下是 serviceModel 的部分...
<basicHttpBinding>
<binding name="Authentication" >
<security mode="TransportCredentialOnly" >
<message clientCredentialType="UserName"/>
</security>
</binding>
</basicHttpBinding>
<service behaviorConfiguration="ApiBehavior" name="CriticalWatch.AuthenticationAPI.AuthenticationAPI">
<endpoint address="/" binding="basicHttpBinding" bindingConfiguration="AuthenticationBinding" name="Authentication" contract="CriticalWatch.AuthenticationAPI.IAuthenticationAPI" />
</service>
然后我有一个验证器的行为......
<serviceBehaviors>
<behavior name="ApiBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Service.CustomUserNameValidator, MyService" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
我的 CustomUserNameValidator 继承自 UserNamePasswordValidator。验证器类被实例化,但从未调用 Validate 方法。另外,客户端可以在不传递任何用户名和密码的情况下调用该方法。
我错过了什么?
这个时候,我想要一个不需要HTTPS的解决方案。我想依赖随消息传递的用户名和密码。
最佳答案
另外,请参阅我的博客文章,了解如何实现允许您在没有 SSL 的情况下通过 HTTP 传递用户名和密码的绑定(bind):http://blog.tonysneed.com/2012/06/18/building-scalable-and-secure-wcf-services/ 但是请记住,通过非安全传输以明文形式传递凭据并不是一个好主意.我描述的技术假设您使用另一种机制(例如 IPSec)来保护传输,并且它对于支持 SSL 终止以获得更好可扩展性的负载平衡器很有用。
为了专门解决您的情况,我建议您咬紧牙关并使用 SSL 设置您的开发环境,以便您可以将 HTTPS 绑定(bind)与 WCF 和您的用户名密码验证器一起使用。这比实现自定义绑定(bind)元素要容易得多,也没有您想象的那么困难。事实上,如果您安装了 IIS Express,您将获得一个自签名证书,您可以轻松地将其用作 IIS 或 Windows 服务的证书。
干杯,
托尼·斯尼德
关于http - 使用 HTTP 的 WCF 自定义用户名身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12828295/