使用客户端IP地址的WCF安全性

时间:2010-10-14 21:33:45

标签: wcf

我有一个WCF服务,可以访问某些数据。我们的客户要求限制此服务,以便给定用户只能在特定时间段内拨打这么多电话。我的想法是建立一个请求速率限制,并在超过该限制时对该IP地址发出临时禁止。

但是,似乎只有一种方法可以使用WCF获取呼叫者的IP:

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

这对我来说根本没用,因为RemoteEndpointMessageProperty是使用HttpContext的Request.UserHostAddress属性设置的。通常,这没关系,除了我们的Web服务位于负载均衡器后面,导致Request.UserHostAddress始终显示负载均衡器的IP,而不是原始调用者。

我知道使用X-Forwarded-For等,并且实际上已经在我们的负载均衡器上配置了,但似乎没有任何方法可以挂钩到http请求以访问标题将WCF服务设置为在ASP.NET兼容模式下运行。这真的是我唯一的选择吗?

2 个答案:

答案 0 :(得分:3)

您可以以相同的方式访问HTTP标头。您必须使用HttpRequestMessageProperty而不是RemoteEndpointMessageProperty。此属性包含标头名称值集合,因此您应该能够从传入请求中获取任何HTTP标头。

答案 1 :(得分:0)

如果用户位于ISP NAT(或公司NAT)后面,如何可靠地将用户与IP地址绑定,您将只获得ISP的公共IP地址。相反,如何使用API​​密钥(许多专业,如谷歌和Twitter正在进行)或通过其他方式(如客户端证书)识别您的用户,然后跟踪持久性存储中的使用情况以进行限制。

另一种选择是使用防火墙规则在网络层引入这种IP地址限制机制(假设可能没有经验)