2012-01-06 10 views
5

मैं एक X509 प्रमाणपत्र के साथ एक डुप्लेक्स WCF सेवा से कनेक्ट कर रहा हूँ के लिए उपयोग करने के लिए, इस तरह ग्राहक कॉन्फ़िग फ़ाइल में प्रमाण पत्र के विवरण को निर्दिष्ट:गतिशील रूप से सेट 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> 

कोड है कि तब से कनेक्ट होता है डब्ल्यूसीएफ सेवा:

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

अब मुझे क्लाइंट प्रमाणपत्र नाम निर्दिष्ट करने की आवश्यकता है जिसे कोड में प्रोग्रामेटिक रूप से उपयोग किया जाएगा। क्या यह मेरे लिए ऐसा करना संभव है? मैं देख सकता हूँ कि मैं अपने ही x509Certificate2 वर्ग बना सकते हैं, लेकिन मुझे यकीन है कि कैसे/findValue="clientName" बिट सेट बदलने के लिए नहीं कर रहा हूँ ...

धन्यवाद

+1

क्लाइंट प्रमाणपत्र प्रमाणपत्र का उपयोग करने के बारे में, http://msdn.microsoft.com/en-us/library/system.servicemodel.description.clientcredentials.clientcertificate.aspx देखें। यह लिंक भी देखें http://stackoverflow.com/questions/2406136/wcf-certificates-without-certificate- स्टोर जिसमें एक स्निपेट है जो चैनल के एंडपॉइंट व्यवहार में इस संपत्ति को कैसे पहुंचा सकता है। – 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(); 

कौन सा मेरी config बदल दिया।

संबंधित मुद्दे