Joh*_* Wu 5 .net c# wcf servicebehavior
我的站点调用一个服务(让我们称之为FooService),它需要一组非常复杂的身份验证协议.这些协议都包含在自定义的ClientCredentials行为中,该行为在代码中声明如下:
class FooServiceCredentialsBehavior : ClientCredentials
{
public FooServiceCredentialsBehavior()
{
//Set up service certificate
var cert = CertStore.FindBySerialNumber(certSerialNumber);
base.ServiceCertificate.DefaultCertificate = cert;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们注册行为扩展:
<behaviorExtensions>
<add name="FooServiceCredentials" type="MyProject.Namespace.FooService, MyProject" />
</behaviorExtensions>
Run Code Online (Sandbox Code Playgroud)
配置endpointBehavior以使用它:
<endpointBehaviors>
<behavior name="FooServiceCredentialsBehavior">
<FooServiceCredentials />
</behavior>
Run Code Online (Sandbox Code Playgroud)
并设置端点以使用它:
<endpoint address="https://fooservice.com/bar"
behaviorConfiguration="FooServiceCredentialsBehavior"
contract="FooService_PortType" />
Run Code Online (Sandbox Code Playgroud)
以上所有工作都很完美,并且已经为许多客户服务多年.
我现在正在将这些内容部署到无法访问CRL服务器的系统,并且自定义行为包括已启用验证的服务证书.所以我需要关闭验证.但是我无法修改FooServiceCredentials类.如果可以,我会这样做:
base.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
Run Code Online (Sandbox Code Playgroud)
但我不能.
我想知道是否可以添加应用于将执行相同操作的自定义凭据行为的WCF配置.像这样的东西:
<endpointBehaviors>
<behavior name="FooServiceCredentialsBehavior">
<FooService>
<ServiceCertificate>
<authentication certificateValidationMode="None"/>
</ServiceCertificate>
</FooService>
</behavior>
Run Code Online (Sandbox Code Playgroud)
这个确切的XML不起作用(该服务甚至不会启动)但我希望有一些神奇的方法可以安排这些标签来禁用仅来自配置的服务证书验证.
可能吗?怎么样?
官方文档说是可以做到的。检查以下链接:serviceCertificate Element 的身份验证。
我认为使用behaviorExtension配置,您可以使用以下配置,因为您继承自ClientCredentials:
<behavior name="FooServiceCredentialsBehavior">
<FooServiceCredentials>
<serviceCertificate>
<authentication certificateValidationMode="None" revocationMode="NoCheck" />
</serviceCertificate>
</FooServiceCredentials>
</behavior>
Run Code Online (Sandbox Code Playgroud)
如果这不起作用,还有另一种可能的选择,无需使用behaviorExtension并直接在clientCredentials配置中指定您的类,如下所示:
<behavior name="FooServiceCredentialsBehavior">
<clientCredentials type="FooNamespace.FooServiceCredentialsBehavior, FooAssemblyName">
<serviceCertificate>
<authentication certificateValidationMode="None" revocationMode="NoCheck" />
</serviceCertificate>
</clientCredentials>
</behavior>
Run Code Online (Sandbox Code Playgroud)