2010-11-25 32 views
5

Ứng dụng GUI của tôi điều khiển Dịch vụ Windows của chị bằng cách sử dụng số NetNamedPipeBinding của WCF. Tôi muốn ngăn các ứng dụng khác mạo danh ứng dụng GUI của mình và kiểm soát dịch vụ của tôi.Xác thực WCF cho IPC và Truy cập từ xa

Có cần phải xác thực ứng dụng GUI cho Dịch vụ Windows để ngăn chặn mạo danh không?
Và tôi nên làm thế nào?


Edit: máy tính từ xa cũng sẽ có thể kiểm soát các dịch vụ nhất định mà chúng được chứng thực (đáng tin cậy bởi dịch vụ), vì vậy tôi cần phải thêm một thiết bị đầu cuối NetTcpBinding. Bất kỳ câu trả lời nào kết hợp điều này cũng sẽ hữu ích.

Trả lời

2

Có, nó là cần thiết để bảo vệ kênh WCF để ngăn chặn mạo danh. WCF có thể mã hóa thông tin liên lạc của bạn tự động khi bạn hướng dẫn nó, nhưng bạn cần phải tự xử lý phần xác thực.

Có hai phương pháp bảo mật thư trong WCF (ba nếu bạn tính thực tế là bạn có thể sử dụng cả hai thư cùng một lúc). Có một lời giải thích mức cao tốt here. Phương pháp nào trong số những phương pháp này bạn có thể sử dụng phụ thuộc vào ràng buộc nào chúng ta đang nói về (bạn sẽ có các tùy chọn khác nhau cho các ràng buộc khác nhau).

Hơn nữa, đối với mỗi phương pháp bảo mật dịch vụ, bạn sẽ có lựa chọn giữa các loại chứng thực xác thực (phương tiện thực tế mà mỗi thực thể sẽ chứng minh nhận dạng của nó với điểm cuối khác). Điều này phụ thuộc vào sự ràng buộc và cũng trên phương thức bảo mật.

Để xem tùy chọn của bạn cho từng ràng buộc, bạn có thể kiểm tra thuộc tính Security của nó. Thuộc tính này thuộc loại khác nhau cho mỗi ràng buộc (ví dụ: NetTcpSecurity); bạn có thể kiểm tra MSDN hoặc IntelliSense để tìm ra điều này.

Tôi sẽ sử dụng NetTcpBinding với bảo mật giao thông làm ví dụ từ bây giờ trở đi.

Để thiết lập an ninh, cả trong máy chủ và khách hàng một phần, trước tiên bạn phải cấu hình các ràng buộc với chế độ bảo mật và loại xác thực trước khi tạo và mở các kênh, ví dụ:

var binding = new NetTcpBinding { /* set props here */ }; 
// TLS security with X.509 certificates 
binding.Security.Mode = SecurityMode.Transport; 
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate; 

Sau đó, trên phía máy chủ (ví dụ này là cụ thể cho những lựa chọn thực hiện ở trên):

// Load and set the server certificate 
var serverCertificate = new X509Certificate2(/* parameters here */); 
host.Credentials.ServiceCertificate.Certificate = serverCertificate; 

// You can leave it at that and let Windows validate the client's certificate using 
// the default method (which means that you either need to have added the client's 
// certificate to the server machine's certificate store as "trusted", or rely on chain 
// trust and have the client's certificate signed by a trusted authority. 

// Or, you can use custom validation rules: 
var authentication = host.Credentials.ClientCertificate.Authentication; 
authentication.CertificateValidationMode = X509CertificateValidationMode.Custom; 
authentication.CustomCertificateValidator = new AcceptAnythingCertificateValidator(); 

Và về phía khách hàng (ví dụ này cũng là cụ thể):

var clientCertificate = new X509Certificate2(/* parameters here */); 
var factory = new ChannelFactory<IYourServiceInterface>(binding, endpoint); 
factory.Credentials.ClientCertificate.Certificate = clientCertificate; 

// You can leave it at that and let Windows validate the server's certificate using 
// the default method (which means that you either need to have added the server's 
// certificate to the client machine's certificate store as "trusted", or rely on chain 
// trust and have the server's certificate signed by a trusted authority. 

// Or, you can use custom validation rules: 
var authentication = factory.Credentials.ServiceCertificate.Authentication; 
authentication.CertificateValidationMode = X509CertificateValidationMode.Custom; 
authentication.CustomCertificateValidator = new AcceptAnythingCertificateValidator(); 

var channel = factory.CreateChannel(); 

// Your channel is now ready for use! You can also cast to to IClientChannel 
// to expose some more properties. 
+0

Cảm ơn câu trả lời tuyệt vời của bạn. Bất kỳ bình luận nào về việc sử dụng 'MessageCredentialType.Windows'? Nếu tôi muốn cho phép quản trị viên mạng kiểm soát dịch vụ trên máy tính từ xa, cách dễ nhất để cho phép Windows xử lý vấn đề người dùng/mật khẩu là gì? –

+0

Bảo mật Windows yêu cầu người dùng phải đăng nhập vào tài khoản người dùng Windows trong miền và không yêu cầu thêm tên người dùng/mật khẩu. Hãy xem http://msdn.microsoft.com/en-us/library/ms734769.aspx này (cụ thể Triển khai Bảo mật Windows trên Dịch vụ Mạng nội bộ) và tại http://msdn.microsoft.com/en-us này /library/ms730301.aspx cho các ví dụ. – Jon

+0

Cảm ơn. Đã tìm ra cách và tìm thấy điều này: http://msdn.microsoft.com/en-us/library/ms734673.aspx Bây giờ tôi chỉ cần kiểm tra nó :) –

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