2010-11-25 25 views
5

Mi aplicación de GUI controla su Servicio de Windows hermano utilizando WCF NetNamedPipeBinding. Quiero evitar que otras aplicaciones se hagan pasar por mi aplicación GUI y controlen mi servicio.Autenticar WCF para IPC y acceso remoto

¿Es necesario autenticar la aplicación GUI en el Servicio de Windows para evitar la suplantación?
¿Y cómo debería hacerlo?


Editar: ordenadores remotos también deben ser capaces de controlar el servicio dado que son autenticados (de confianza por el servicio), por lo que tenga que añadir un punto final NetTcpBinding. Cualquier respuesta que incorpore esto también sería útil.

Respuesta

2

Sí, es necesario proteger el canal WCF para evitar la suplantación. WCF puede encriptar sus comunicaciones automáticamente cuando usted lo instruye, pero necesita manejar la parte de autenticación usted mismo.

Existen dos métodos para proteger mensajes en WCF (tres si se cuenta el hecho de que puede usarlos a la vez). Hay una buena explicación de alto nivel here. Cuál de estos métodos puede usar depende de qué enlace estamos hablando (tendrá diferentes opciones para diferentes enlaces).

Además, para cada método de seguridad del servicio, tendrá la opción entre los tipos de credenciales de autenticación (el medio real en el que cada entidad demostrará su identidad al otro extremo). Esto depende del enlace y también del método de seguridad.

Para ver cuáles son sus opciones para cada enlace, puede verificar su propiedad Security. Esta propiedad es de un tipo diferente para cada enlace (por ejemplo, NetTcpSecurity); puede consultar MSDN o IntelliSense para averiguarlo.

Voy a utilizar NetTcpBinding con la seguridad del transporte como un ejemplo a partir de ahora.

Para configurar la seguridad, tanto en la parte del servidor y el cliente, primero hay que configurar el enlace con el modo de seguridad y el tipo de autenticación antes de crear y abrir el canal, por ejemplo:

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

Luego, el el lado del servidor (este ejemplo es específico para las elecciones hechas anteriormente):

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

Y en el lado del cliente (en este ejemplo es también específica):

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

Gracias por su gran respuesta. ¿Algún comentario sobre el uso de 'MessageCredentialType.Windows'? Si quiero permitir que un administrador de red controle el servicio en una computadora remota, ¿cuál sería la forma más fácil de dejar que Windows se ocupe del problema de usuario/contraseña? –

+0

La seguridad de Windows requiere que el usuario ya haya iniciado sesión en una cuenta de usuario de Windows en un dominio y no requiera un nombre de usuario/contraseña adicional. Eche un vistazo a este http://msdn.microsoft.com/en-us/library/ms734769.aspx (específicamente Implementación de la seguridad de Windows en los servicios de intranet) y también a este http://msdn.microsoft.com/es-es/ /library/ms730301.aspx para ver ejemplos. – Jon

+0

Gracias. Descubrí cómo y encontré esto: http://msdn.microsoft.com/en-us/library/ms734673.aspx Ahora solo necesito probarlo :) –