【发布时间】:2011-09-28 19:42:42
【问题描述】:
我的特殊问题是这样的:
-
我们目前正在运行一组服务,要求客户端在调用服务时提供用户名和密码作为身份验证。
-
我们希望在这些服务上实施 PKI 基础架构,但我们的一些合作伙伴将花费比其他合作伙伴更长的时间来适应这种新的基础架构。
-
作为第一步,我们需要一些合作伙伴提供客户证书。需要客户端证书(除了用户名和密码)来访问他们在我们服务器上的数据,而其他用户只需要用户名和密码。
为了解决这个问题,我尝试在 WCF 中为用户名/密码身份验证(使用 UserNamePasswordValidator)和客户端证书(使用 X509CertificateValidator)实现自定义验证器。用户名/密码验证器将向我们的数据库验证这些凭据,而客户端证书验证器将检查请求是否来自我们需要证书的客户端,如果是,则验证是否提供了有效的客户端证书。我无法配置 WCF 以使其同时使用这两个验证器。
我在服务器上的 WCF 配置当前设置如下:
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpsGetEnabled="true" policyVersion="Policy15" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<clientCertificate>
<authentication customCertificateValidatorType="MyWS.Security.MyServicesCertificateValidator, MyWS"
certificateValidationMode="Custom" revocationMode="NoCheck" />
</clientCertificate>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="MyWS.Security.MyServicesUsernameValidator, MyWS" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
<bindings>
<basicHttpBinding>
<binding name="MySoapBinding">
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="Certificate" />
<message clientCredentialType="UserName" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="MyServiceBehavior" name="MyWS.Services.TheService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="MySoapBinding" name="TheService" bindingNamespace="https://services.my/TheService" contract="MyWS.Interfaces.Service.ITheService" />
<host>
<baseAddresses>
<add baseAddress="https://localhost:4434/MyWS/TheService"/>
</baseAddresses>
</host>
</service>
</services>
据我了解,此配置无效,因为我无法在传输层使用customCertificateValidatorType(因为 IIS 会在此处涉及 WCF 之前检查证书),但我看不到如何组合customCertificateValidatorType 和 customUserNamePasswordValidatorType 都是消息层的凭据类型。
我已经实现了一个消息检查器,并且可能能够以某种方式使用OperationContext 来解决问题(如下面的链接中所建议的那样),但我还没有找到让我这样做的方法还没有。
http://social.msdn.microsoft.com/Forums/en/wcf/thread/b6ab8b58-516b-41d4-bb0e-75b4baf92716
我想我可能正在尝试实现与 WCF 工作方式不兼容的东西,但如果有人知道如何解决这个问题,我很高兴收到您的反馈。
【问题讨论】:
标签: wcf certificate client