2012-01-06 10 views
5

sto Connessione a un servizio duplex WCF con una cert x509, specificando i dettagli del certificato nel file di configurazione del client come questo:dinamicamente set x509 da utilizzare per WCF comunicazioni duplex

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

Il codice che poi si collega a servizio WCF:

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

Ora è necessario specificare il nome del certificato client che verrà utilizzato in modo programmatico, nel codice. È possibile per me farlo? Vedo che posso creare la mia propria classe X509Certificate2, ma non sono sicuro come cambiare/impostare il bit findValue="clientName" ...

Grazie

+1

Come utilizzare la proprietà ClientCertificate, vedere http://msdn.microsoft.com/en-us/library/system.servicemodel.description.clientcredentials.clientcertificate.aspx. vedi anche questo link http://stackoverflow.com/questions/2406136/wcf-certificates-without-certificate-store che ha uno snippet che mostra come accedere a questa proprietà nel comportamento dell'endpoint del canale. – wal

risposta

2

Ok, in modo da utilizzare il commento utile da Wal (grazie!) Sono riuscito a farlo funzionare. Il problema che ho dovuto affrontare è stata la scoperta che se si sta per impostare dinamicamente qualsiasi parte della configurazione del client nel codice, non è possibile utilizzare alcuno di .config - è necessario definirlo tutto in codice. Quindi è praticamente tutto o niente. Almeno quella fu la mia esperienza.

Quindi, per me, ho dovuto fare questo:

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(); 

che ha sostituito il mio config.

Problemi correlati