2010-10-14 93 views
5

我有一個WCF服務,它提供對某些數據的訪問。我們的客戶要求限制這項服務,以便給定用戶在特定時間內只能撥打這麼多電話。我的想法是建立一個請求速率限制,並在該IP地址超過限制時暫時禁止該IP地址。使用客戶端IP地址的WCF安全性

然而,似乎只有一種方式使用WCF獲得致電者的IP:

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

,因爲在所有的RemoteEndpointMessageProperty使用的的Request.UserHostAddress屬性的HttpContext設置這對我來說並不實用根據它被服務。通常情況下,沒關係,除非我們的Web服務位於負載平衡器後面,這會導致Request.UserHostAddress始終顯示負載平衡器的IP,而不是原始調用方。

我知道如何使用X-Forwarded-For等,並且實際上已經在我們的負載平衡器上配置了它,但似乎沒有任何方法可以掛鉤http請求來訪問標題設置WCF服務在ASP.NET兼容模式下運行。這真的是我唯一的選擇嗎?

回答

3

您可以用同樣的方式訪問HTTP標頭。而不是RemoteEndpointMessageProperty,你必須使用HttpRequestMessageProperty。此屬性包含Headers名稱值集合,所以您應該能夠從傳入請求獲取任何HTTP標頭。

+1

最終,這個答案是有效的,所以我接受它,但.NET 3.5和更高版本添加了一個WebOperationContext類到System.ServiceModel.Web命名空間,這使得這更容易一些。 – Chris 2010-10-15 16:12:53

+0

是的,但是這個解決方案對於所有基於Http的綁定是通用的。 WebOperationContext只能用於REST服務(在WebHttpBinding上公開)。 – 2010-10-15 17:31:53

0

如果用戶在ISP NAT(或公司NAT)後面,您如何可靠地將用戶綁定到IP地址,您將只能獲得ISP的公共IP地址。取而代之的是,如何使用API​​密鑰(許多專業人員(如Google和Twitter)正在執行)或通過其他方式(例如客戶端證書)識別您的用戶,然後跟蹤持久存儲中的使用情況以進行限制。

另一種辦法是引進這種使用防火牆規則在網絡層的IP地址限制機制(我不是假設有可能經歷)

+0

該網絡服務將直接通過橫幅廣告進行訪問。沒有機會爲每個用戶分配一個特定的密鑰。我知道IP限制的危險,但這是我們目前所有的。 – Chris 2010-10-15 01:34:43

+0

好吧,那麼通過IP使用某種防火牆或入侵檢測系統而不是應用層來限制請求的可行性如何? – softveda 2010-10-15 05:20:21