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?
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
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). –