2

我在 WCF 中有一个 ClientCredentials 的自定义实现。ClientCredentials 的两个基本属性是 ClientCertificate 和 ServiceCertificate,如此处 (MSDN)所示。

在我的配置中,我设置了自定义 ClientCredentials,并定义了两个证书:

        <endpointBehaviors>
            <behavior name="MyCustomEndpointBehavior">
                <clientCredentials type="MyApp.Security.CentralAuthClientCredentials, MyApp">
                    <clientCertificate findValue="localhost" x509FindType="FindBySubjectName" storeLocation="CurrentUser" storeName="My" />
                    <serviceCertificate>
                        <defaultCertificate findValue="localhost" x509FindType="FindBySubjectName" storeLocation="CurrentUser" storeName="My" />
                        <authentication certificateValidationMode="None" revocationMode="NoCheck" />
                    </serviceCertificate>
                </clientCredentials>
            </behavior>
        </endpointBehaviors>

此配置完全 100%使用用户名身份验证。它使用证书来加密消息的用户名和密码。然后我更改为我的自定义 ClientCredentials。

在运行时,以下是在我的 CentralAuthClientCredentials 上设置的属性:

this.ClientCertificate = System.ServiceModel.Security.X509CertificateInitiatorClientCredential
this.ClientCertificate.Certificate = null
this.ServiceCertificate = System.ServiceModel.Security.X509CertificateRecipientClientCredential
this.ServiceCertificate.DefaultCertificate = null

那么,为什么配置中定义的客户端和服务默认证书没有设置在实际实例化的对象上呢?看起来 WCF 完全忽略了 XML 标记!

是否可以使用一些代码(可能在凭据的构造函数中)从配置中手动获取这些证书?

谢谢你的帮助!


更新

我是个白痴。我想到了。WCF 实际上是使用证书集正确创建了我的实例,但是在我的 wcf 客户端中,我有以下删除/添加系列,我我是从 MSDN 示例中复制的:

this.ChannelFactory.Endpoint.Behaviors.Remove<ClientCredentials>();
this.ChannelFactory.Endpoint.Behaviors.Add(new CentralAuthClientCredentials());
return base.Channel.MyServiceMethod();

删除旧凭据并添加我自己的自定义凭据。然而,这是一个没有设置证书的新实例!哎呀!

4

1 回答 1

1

为了将其标记为已回答,我添加了自己的解决方案,即从创建新凭据的客户端中删除此代码:

this.ChannelFactory.Endpoint.Behaviors.Remove<ClientCredentials>();
this.ChannelFactory.Endpoint.Behaviors.Add(new CentralAuthClientCredentials());

并使用 WCF 已经设置的那个,而不是在其上调用 Remove()。

于 2009-03-19T11:39:55.427 回答