2009-09-15 11 views
7

Tengo algunos servicios que consumen los clientes dentro de una zona segura. Me han pedido que proteja estos servicios normalmente contra clientes de desarrollo que se conectan erróneamente al servicio incorrecto.Cómo restringir el acceso a un servicio WCF con una clave compartida

La idea era la clave precompartida (como un guid) que se establece en la configuración tanto para el cliente como para el host del servicio. Cuando el cliente intente consumir el servicio, debe presentar la clave correcta.

¿Qué debo hacer para configurar un servicio para implementar este tipo de seguridad? ¿Cuánta personalización es necesaria?

Respuesta

0

Si lo hace utilizando la clave, cambiaría el contrato del servicio para incluir un campo donde se colocaría la clave. Luego, verifique el valor en la clave en el lado del servidor.

Sin embargo, en su caso podría restringir qué direcciones IP se les permitió acceder al servicio, a través de la configuración de red. Esto sería menos trabajo que cambiar la firma de sus servicios.

+0

Esto no es una buena idea - de esa manera, usted tiene que cambiar sus contratos, y que " contaminar "su lógica comercial real con infraestructura/campos de dirección. No recomendaría este enfoque. –

2

Me gustaría que el cliente envíe la clave como un encabezado de mensaje adicional y cree un IDispatchMessageInspector para comprobar el encabezado y, opcionalmente, rechazarlo. This El artículo del Código de proyecto describe la parte del filtro en función de la dirección IP.

+0

Gracias, me gusta el aspecto de este enfoque. He hecho un poco de búsqueda alrededor de esta idea, y parece que debería usar un IClientMessageInspector para insertar la clave en el lado del cliente, implementado como un comportamiento de punto final. Y luego, en el lado del servidor tendré un comportamiento que implementa IDispatchMessageInspector que busca la clave. Una última cosa: ¿hay algo listo en wcf que logre un objetivo similar pero sin la necesidad de un comportamiento personalizado? – Columbo

+0

Si no está utilizando las funciones de seguridad WCF, podría usarlas para este enfoque. En ese caso, crearía un certificado para cada aplicación cliente y en cada servicio verificaría los certificados de cliente permitidos. Y supongo que podrías hacer lo mismo con nombre de usuario/contraseña, aunque eso te obligaría a usar HTTPS también. – Maurice

+0

Gracias, la autenticación de usuario/contraseña fue algo que habíamos considerado anteriormente, pero tuvimos algunos problemas con el SSL y nuestra configuración de red que significaba que comenzamos a buscar otras formas de cumplir con el requisito. Según lo que he aprendido hoy, creo que usaré este enfoque para enviar una clave compartida en el encabezado. Así que ahora solo es para hacer un pequeño proyecto de prueba :) – Columbo

3

Puede agregar fácilmente un encabezado de mensaje personalizado a cada llamada; es bastante fácil de hacer, de hecho, y no "contamina" su contrato de servicio real, p. no tiene que agregar parámetros adicionales a sus llamadas de servicio solo para pasar esto.

Consulte estos artículos para obtener información sobre cómo lograr esto:

Básicamente, es necesario envolver su llamada al servicio en un OperationContext - eso es todo, no se necesita ClientMessageInspector ni ningún otro truco :-)

using (OperationContextScope scope = new OperationContextScope(proxy)) 
{ 
    Guid myToken = Guid.NewGuid(); 

    MessageHeader<Guid> mhg = new MessageHeader<Guid>(myToken); 
    MessageHeader untyped = mhg.GetUntypedHeader("token", "ns"); 

    OperationContext.Current.OutgoingMessageHeaders.Add(untyped); 

    proxy.DoOperation(...); 
    } 

y en el lado del servidor, sólo tiene que inspeccionar la colección IncomingMessageHeaders:

Guid myToken = OperationContext.Current. 
       IncomingMessageHeaders.GetHeader<Guid>("token", "ns"); 

Marc

+0

Hola Marc, suponiendo que Columbo no tenía otra seguridad para el servicio configurado, ¿esta solución todavía resultará en el cifrado del contenido del mensaje WCF? – Xiaofu

+0

@Xiaofu: de manera predeterminada (a menos que lo desactive explícitamente) **, todos los mensajes WCF se cifran y se firman digitalmente. –

Cuestiones relacionadas