【问题标题】:WCF security using client IP address使用客户端 IP 地址的 WCF 安全性
【发布时间】:2011-04-25 15:57:30
【问题描述】:

我有一个提供对某些数据的访问的 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 兼容模式下运行。这真的是我唯一的选择吗?

【问题讨论】:

    标签: wcf


    【解决方案1】:

    如果用户位于 ISP NAT(或公司 NAT)之后,您如何可靠地将用户与 IP 地址绑定,您将只能获得 ISP 的公共 IP 地址。相反,如何使用 API 密钥(Google 和 Twitter 等许多专业人士正在这样做)或其他方式(例如客户端证书)识别您的用户,然后在持久性存储中跟踪使用情况以进行节流。

    另一种选择是使用防火墙规则在网络层引入这种通过 IP 地址进行限制的机制(我不认为这是可能的)

    【讨论】:

    • 网络服务将通过横幅广告直接访问。没有机会为每个用户分配特定的密钥。我知道 IP 限制的危险,但我们目前只有这些。
    • 好的,那么使用某种防火墙或入侵检测系统而不是在应用层限制 IP 请求的可行性如何。
    【解决方案2】:

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

    【讨论】:

    • 最终,这个答案是有效的,所以我接受它,但 .NET 3.5 及更高版本向 System.ServiceModel.Web 命名空间添加了一个 WebOperationContext 类,这使得这更容易一些。
    • 是的,但此解决方案适用于所有基于 Http 的绑定。 WebOperationContext 应该只适用于 REST 服务(在 WebHttpBinding 上公开)。
    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 2017-01-17
    • 2017-10-28
    • 2011-10-04
    • 1970-01-01
    • 2011-10-22
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多