2010-11-25 17 views
5

La mia applicazione GUI controlla il suo servizio Windows secondario utilizzando WC2 NetNamedPipeBinding. Voglio impedire ad altre applicazioni di impersonare la mia applicazione GUI e controllare il mio servizio.Authenticate WCF per IPC e accesso remoto

È necessario autenticare l'applicazione GUI per il servizio di Windows per impedire la rappresentazione?
E come dovrei farlo?


Edit: computer remoti dovrebbero anche essere in grado di controllare il servizio dato che essi sono autenticati (di fiducia da parte del servizio), quindi ho bisogno di aggiungere un endpoint NetTcpBinding. Qualsiasi risposta che incorpori anche questo, sarebbe utile.

risposta

2

Sì, è necessario proteggere il canale WCF per impedire la rappresentazione. WCF può crittografare automaticamente le comunicazioni quando viene istruito, ma è necessario gestire la parte di autenticazione da soli.

Esistono due metodi di protezione dei messaggi in WCF (tre se si considera il fatto che è possibile utilizzarli entrambi contemporaneamente). C'è una buona spiegazione di alto livello here. Quale di questi metodi è possibile utilizzare dipende da quale associazione stiamo parlando di (si avranno diverse opzioni per diversi collegamenti).

Inoltre, per ciascun metodo di protezione del servizio è possibile scegliere tra i tipi di credenziali di autenticazione (il mezzo effettivo in cui ciascuna entità dimostrerà la propria identità all'altro endpoint). Questo dipende dall'associazione e anche dal metodo di sicurezza.

Per vedere quali sono le opzioni disponibili per ogni associazione, è possibile controllare la proprietà Security. Questa proprietà è di un tipo diverso per ogni associazione (ad esempio NetTcpSecurity); puoi controllare MSDN o IntelliSense per scoprirlo.

Utilizzerò da ora in poi NetTcpBinding con sicurezza di trasporto come esempio.

Per impostare la sicurezza, sia nella parte server e client, è necessario innanzitutto configurare il legame con la modalità di protezione e il tipo di autenticazione prima di creare e di aprire il canale, ad esempio:

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

Poi, il il lato server (questo esempio è specifico per le scelte fatte in precedenza):

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

E sul lato client (questo esempio è anche specifici):

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

Grazie per la tua grande risposta. Qualche commento sull'uso di 'MessageCredentialType.Windows'? Se voglio consentire a un amministratore di rete di controllare il servizio su un computer remoto, quale sarebbe il modo più semplice per consentire a Windows di risolvere il problema degli utenti/password? –

+0

Per la sicurezza di Windows è necessario che l'utente abbia già effettuato l'accesso a un account utente di Windows in un dominio e non richieda un nome utente/password aggiuntivi. Dai un'occhiata a questo http://msdn.microsoft.com/en-us/library/ms734769.aspx (in particolare Implementazione di Windows Security sui servizi Intranet) e anche su questo http://msdn.microsoft.com/it-it /library/ms730301.aspx per esempi. – Jon

+0

Grazie. Capito come e trovato questo: http://msdn.microsoft.com/en-us/library/ms734673.aspx Ora ho solo bisogno di testarlo :) –

Problemi correlati