2012-01-06 2 views
5

Я подключение к службе дуплекса WCF с x509 CERT, с указанием сведений о сертификате в файле конфигурации клиента, как это:Динамически x509 использовать для WCF дуплексного порта связи

<behaviors> 
    <endpointBehaviors> 
    <behavior name="ScannerManagerBehavior"> 
     <clientCredentials> 
     <clientCertificate findValue="ClientName" x509FindType="FindBySubjectName" storeLocation="CurrentUser" storeName="My" /> 
     <serviceCertificate> 
      <authentication certificateValidationMode="PeerTrust" /> 
     </serviceCertificate> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

код, который затем подключается к служба WCF:

DuplexChannelFactory<IScannerManager> _smFactory 
= new DuplexChannelFactory<IScannerManager>(instanceContext, nameOfEndPoint); 
var _commsChannel = _smFactory.CreateChannel(); 

Теперь мне нужно указать имя сертификата клиента, которое будет использоваться программно, в коде. Возможно ли это сделать? Я могу видеть, что я могу создать свой собственный класс X509Certificate2, но я не уверен, как изменить/установить findValue="clientName" бит ...

Благодаря

+1

Как насчет использования свойства ClientCertificate, см. Http://msdn.microsoft.com/en-us/library/system.servicemodel.description.clientcredentials.clientcertificate.aspx. см. Также эту ссылку http://stackoverflow.com/questions/2406136/wcf-certificates-without-certificate-store, в которой есть фрагмент, показывающий, как получить доступ к этому свойству в поведении канала в конечной точке. – wal

ответ

2

Итак, используя полезный комментарий от валь (спасибо!) Мне удалось заставить его работать. Проблема, с которой я столкнулся, заключалась в том, что если вы собираетесь динамически устанавливать какую-либо часть конфигурации клиента в коде, вы не можете использовать какой-либо из .config - вы должны определить все это в коде. Так что это почти все или ничего. По крайней мере, это был мой опыт.

Так, для меня, я должен был сделать это:

var binding = new NetTcpBinding(); 
binding.Security.Mode = SecurityMode.Transport; 
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate; 
binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign; 
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 

var identity = new DnsEndpointIdentity("localhost"); 
Uri uri = new Uri("tcp:URI goes here"); 
var address = new EndpointAddress(uri, identity, new AddressHeaderCollection()); 

_smFactory = new DuplexChannelFactory<IScannerManager>(instanceContext, binding, address); 

_smFactory.Credentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "CustomCertificateNameHere"); 
_commsChannel = _smFactory.CreateChannel(); 

который заменил мой конфиг.