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.
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? –
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
Grazie. Capito come e trovato questo: http://msdn.microsoft.com/en-us/library/ms734673.aspx Ora ho solo bisogno di testarlo :) –