2011-02-25 9 views
5

soy novato en WCF y tuberías con nombre.Protección de la tubería con nombre utilizada por WCF

Necesito una forma de comunicar de forma segura entre una aplicación de IU y el Servicio de Windows en la misma máquina. Esto es lo que necesito: - La aplicación de interfaz de usuario del cliente debe enviar (enviar) varios tipos de mensajes al servicio de Windows. - Las necesidades de la aplicación de interfaz de usuario del cliente recibirán varios tipos de mensajes del servicio (empujados o tirados).

(el mensaje aquí es simplemente un dato serializado estructurado).

Ahora todo este intercambio debe realizarse solo bajo la cuenta de usuario autorizado (que puede ser diferente de la cuenta de servicio). Así que estaba pensando en ACLing una tubería con nombre para el servicio y la cuenta de usuario.

Sin embargo, la tubería con nombre solo admite transmisiones. Tengo varios tipos de mensajes que deben intercambiarse por la tubería con nombre, lo que significa que necesito definirlos y serializarlos/deserializarlos.

Para evitar esto, pensé en usar WCF (para serialización y soporte de RPC) en tuberías con nombre. También aloje el servicio WCF en el servicio de Windows.

Pregunta 1) ¿Es este un buen enfoque? Dudo en usar http o tcp debajo de WCF ya que la comunicación debe permanecer dentro de la máquina.

Pregunta 2) ¿Cómo y si puedo ACL el tubo con nombre que usaría WCF? ¿Es esto algo que puedo controlar? Creo que ACLing the name pipe con SIDs específicos me proporciona una mejor seguridad en lugar de implementar un esquema de autenticación entre el cliente y el servidor.

Gracias por los consejos, sugerencias! Sameer

Respuesta

8

1) Creo que este es un buen enfoque. Tu pensamiento es perfecto.

2) Como parece que ya descubrió, my blog post here shows you one way to set the ACL on the pipe creado por el enlace WCF NetNamedPipe. Implica usar el reflejo para llenar el vacío en la implementación de Microsoft, que originalmente estaba originalmente destinada a admitir un mecanismo directo para configurar la ACL, pero no se finalizó correctamente.

derivar una AclSecuredNamedPipeBinding de CustomBinding y una correspondiente AclSecuredNamedPipeTransportBindingElement de NamedPipeTransportBindingElement. El elemento de unión tiene una lista de de SecurityIdentifier:

internal List<SecurityIdentifier> AllowedUsers { get { return _allowedUsers; } } 
private List<SecurityIdentifier> _allowedUsers = new List<SecurityIdentifier>(); 

la BuildChannelListener<TChannel>(BindingContext)-method se anula para establecer la propiedad privada AllowedUsers:

public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context) 
{ 
    private static Type namedPipeChannelListenerType 
      = Type.GetType("System.ServiceModel.Channels.NamedPipeChannelListener, System.ServiceModel", false); 
    IChannelListener<TChannel> listener = base.BuildChannelListener<TChannel>(context); 
    PropertyInfo p = namedPipeChannelListenerType.GetProperty(
      "AllowedUsers", BindingFlags.Instance|BindingFlags.NonPublic); 
    p.SetValue(listener, _allowedUsers, null); 
    return listener; 
} 

Si usted va esta ruta, asegúrese también para parchear el "vulnerabilidad en cuclillas "como se explica en a later post.

+3

Desafortunadamente este blog ya no está disponible. ¿Alguien recuerda quién hacerlo? Intenté usar la reflexión para configurar los Usuarios Permitidos pero eso no hizo lo que esperaba. Cualquier tipo de ayuda sería buena. – mageos

0

Intenté lo que se sugiere en el "blog de Chris Disson", pero después de ejecutar el código de servicio en privilegio de administrador, obtuve la excepción debajo. "Hay un problema con StudentService Algunas o todas las referencias de identidad no se pudieron traducir." aquí es mi código que albergan el servicio

AclSecuredNamedPipeBinding binding = new AclSecuredNamedPipeBinding(); 
SecurityIdentifier allowedGroup = (SecurityIdentifier)(new 
NTAccount("NPServiceUsers").Translate(typeof(SecurityIdentifier))); 
binding.AddUserOrGroup(allowedGroup); 
studentServiceHost = new ServiceHost(typeof(StudentService.StudentService)); 
Uri httpBaseAddress = new 
Uri("net.pipe://localhost/ServiceHost/ServiceHost"); 

studentServiceHost.AddServiceEndpoint(
typeof(StudentService.IStudentService),binding, httpBaseAddress); 
studentServiceHost.Open(); 

entonces intentó cambiando NTAccount de 'NPServiceUsers' a 'Administradores' me dieron entonces por debajo de excepción.

" Hay un problema con referencia a objeto StudentService no establecida como instancia de un objeto."

studentService es clase que implementa la interfaz IStudentService.

public class StudentService : IStudentService 
{ 
public void DoWork() 
{ 
} 
} 
Cuestiones relacionadas