2010-10-14 27 views
5

Tengo un servicio WCF que proporciona acceso a algunos datos. Nuestro cliente ha solicitado que este servicio sea limitado, de modo que un usuario determinado solo puede hacer tantas llamadas dentro de un determinado período de tiempo. Mi idea era establecer un límite de tasa de solicitud y emitir una prohibición temporal a esa dirección IP una vez que haya excedido ese límite.Seguridad WCF utilizando la dirección IP del cliente

Sin embargo, parece que hay una sola manera de conseguir IP de la persona que llama utilizando WCF:

var context = OperationContext.Current; 
var props = context.IncomingMessageProperties; 
var endpoint = props[RemoteEndpointMessageProperty.Name]; 
return ((RemoteEndpointMessageProperty)endpoint).Address; 

Esto no es útil para mí en absoluto, porque el RemoteEndpointMessageProperty se establece mediante la propiedad de la Request.UserHostAddress HttpContext bajo el cual se sirve. Normalmente, estaría bien, excepto que nuestros servicios web están ubicados detrás de un equilibrador de carga, lo que hace que Request.UserHostAddress muestre siempre la dirección IP del equilibrador de carga, no la llamada original.

Sé sobre el uso de X-Forwarded-For y tal, y de hecho ya lo hemos configurado en nuestro equilibrador de carga, pero no parece haber ninguna forma de engancharme en la solicitud http para acceder a los encabezados cortos de configurar el servicio WCF para operar en el modo de compatibilidad ASP.NET. ¿Es esta REALMENTE mi única opción?

Respuesta

3

Se puede acceder a las cabeceras HTTP de la misma manera. En lugar de RemoteEndpointMessageProperty, debe usar HttpRequestMessageProperty. Esta propiedad contiene la colección de valores de nombre de los encabezados, por lo que debería poder obtener cualquier encabezado HTTP de la solicitud entrante.

+1

En última instancia, esta respuesta es válida, por lo que la acepto, pero .NET 3.5 y posteriores agregaron una clase WebOperationContext al espacio de nombres System.ServiceModel.Web, que hace esto un poco más fácil. – Chris

+0

Sí, pero esta solución es general para todas las vinculaciones basadas en HTTP. WebOperationContext debería funcionar solo para los servicios REST (expuestos en WebHttpBinding). –

0

¿Cómo se puede vincular de manera confiable a un usuario con una dirección IP, especialmente si el usuario está detrás de un ISP NAT (o Company NAT), solo obtendrá la dirección IP pública del ISP. En su lugar, ¿qué le parece identificar a su usuario usando una clave API (que están haciendo muchos mayores como Google y Twitter) o por otros medios (como el certificado del cliente) y luego rastrear el uso en un almacén de persistencia para el estrangulamiento?

Otra opción sería la de introducir este tipo de mecanismo de restricciones por parte de la dirección IP en la capa de red utilizando las reglas del cortafuegos (no estoy experimentado por suponiendo que sea posible)

+0

El servicio web se accederá directamente a través de anuncios publicitarios. No hay oportunidad de asignar una clave específica para cada usuario. Soy consciente de los peligros de la limitación de IP, pero es todo lo que tenemos en este momento. – Chris

+0

Bien, entonces, ¿qué hay de la posibilidad de limitar las solicitudes por IP utilizando algún tipo de firewall o sistema de detección de intrusos en lugar de en la capa de aplicación. – softveda

Cuestiones relacionadas