2012-01-06 17 views
5

Tôi đang kết nối với một dịch vụ duplex WCF với một cert x509, quy định cụ thể các chi tiết chứng chỉ trong tập tin cấu hình khách hàng như thế này:động bộ x509 để sử dụng cho vệ tinh viễn thông duplex 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> 

Mã mà sau đó kết nối với dịch vụ WCF:

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

Bây giờ tôi cần phải chỉ định tên chứng chỉ ứng dụng khách sẽ được sử dụng theo chương trình, trong mã. Tôi có thể làm điều đó không? Tôi có thể thấy rằng tôi có thể tạo lớp x509Certificate2 của riêng tôi, nhưng tôi không chắc chắn làm thế nào để thay đổi/thiết lập các bit findValue="clientName" ...

Cảm ơn

+1

Cách sử dụng thuộc tính ClientCertificate, xem http://msdn.microsoft.com/en-us/library/system.servicemodel.description.clientcredentials.clientcertificate.aspx. cũng xem liên kết này http://stackoverflow.com/questions/2406136/wcf-certificates-without-certificate-store có đoạn trích hiển thị cách truy cập thuộc tính này trong hành vi điểm cuối của Kênh. – wal

Trả lời

2

Ok, vì vậy sử dụng những nhận xét hữu ích từ wal (cảm ơn! Tôi đã cố gắng làm cho nó hoạt động. Những rắc rối tôi phải đối mặt là phát hiện ra rằng nếu bạn sẽ tự động thiết lập bất kỳ phần nào của cấu hình máy khách trong mã, bạn không thể sử dụng bất kỳ của .config - bạn phải xác định tất cả trong mã. Vì vậy, nó khá nhiều hoặc không có gì. Ít nhất đó là kinh nghiệm của tôi.

Vì vậy, đối với tôi, tôi đã phải làm điều này:

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

nào thay thế cấu hình của tôi.

Các vấn đề liên quan