我有一个简单的WCF服务,配置了传输安全性和证书客户端凭据。 我将自定义证书验证程序插入其中,并抛出FaultException。 我的问题是esception消息没有到达客户端:我只收到MessageSecurityException而没有任何错误... 如果我在net.tcp(自托管)中转动我的服务,我会收到一个没有错误的CommunicationExcetion。
以下是我的web.config的一部分:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="wsHttpEndpointBinding" messageEncoding="Text">
<reliableSession enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="SecureService.Server.ChunkStreamService">
<endpoint binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding" behaviorConfiguration="myBehavior" name="wsHttpEndPoint" contract="SecureService.Server.IChunkStreamService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="myBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<clientCertificate>
<authentication customCertificateValidatorType="SecureService.Server.CPSValidator, SecureService.Server" certificateValidationMode="Custom" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
和我的验证员:
public class CPSValidator : System.IdentityModel.Selectors.X509CertificateValidator
{
public override void Validate(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate)
{
throw new FaultException("Certificate is not from a trusted issuer");
}
}
有什么想法吗?
提前感谢您的帮助!
答案 0 :(得分:1)
据我所知,您在验证程序中抛出的任何异常都不会到达客户端。客户端始终收到MessageSecurityException。只有在服务级别(在服务实现中)发生并映射到FaultContract的异常才会正确发送到客户端。
此致 巴勃罗。
答案 1 :(得分:1)
正如Yahia和Pablo所回答的那样,证书验证不会在服务级别进行。因此,FaultException无法到达客户端。但这是真的,因为我正在使用传输安全模式。为了将消息发送回客户端,我必须将我的安全模式从Transport更改为TransportWithMessageCredentials,如下所示:
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="Certificate" negotiateServiceCredential="true" algorithmSuite="Default" />
</security>
这样,证书验证在服务级别完成,因此可以通过faultException将错误消息发送到客户端。
答案 2 :(得分:0)
您是否尝试在服务器上启用WCF诊断以在呼叫到达服务之前捕获WCF管道中的问题?
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Verbose" propagateActivity="true">
<listeners>
<add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="log.evtlog" />
</listeners>
</source>
</sources>
<trace autoflush="true"/>