2010-10-14 30 views
5

Ho un servizio WCF che fornisce l'accesso ad alcuni dati. Il nostro cliente ha richiesto che questo servizio sia limitato in modo tale che un determinato utente possa effettuare solo così tante chiamate entro un certo periodo di tempo. Il mio pensiero era quello di stabilire un limite di velocità di richiesta e di emettere un divieto temporaneo a tale indirizzo IP una volta superato tale limite.Sicurezza WCF tramite l'indirizzo IP del client

Tuttavia, sembra che vi sia solo un modo per ottenere l'IP del chiamante utilizza WCF:

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

Questo non è utile a me a tutti perché il RemoteEndpointMessageProperty viene impostato utilizzando la proprietà Request.UserHostAddress del HttpContext sotto il quale viene servito. Normalmente ciò andrebbe bene, eccetto che i nostri servizi web si trovano dietro un sistema di bilanciamento del carico che fa sì che Request.UserHostAddress mostri sempre l'IP del bilanciamento del carico, non il chiamante originale.

Conosco l'utilizzo di X-Forwarded-For e simili, e in realtà l'ho già configurato sul nostro servizio di bilanciamento del carico, ma non sembra esserci alcun modo per collegarmi alla richiesta http per accedere alle intestazioni brevi di impostare il servizio WCF per operare in modalità di compatibilità ASP.NET. È davvero la mia unica opzione?

risposta

3

È possibile accedere intestazioni HTTP nello stesso modo. Invece di RemoteEndpointMessageProperty devi utilizzare HttpRequestMessageProperty. Questa proprietà contiene la raccolta di valori nome Headers in modo da poter ottenere qualsiasi intestazione HTTP dalla richiesta in arrivo.

+1

In definitiva, questa risposta è valida, quindi lo accetto, ma .NET 3.5 e versioni successive aggiungono una classe WebOperationContext allo spazio dei nomi System.ServiceModel.Web che rende questo un po 'più semplice. – Chris

+0

Sì, ma questa soluzione è generale per tutti i collegamenti basati su Http. WebOperationContext dovrebbe funzionare solo per i servizi REST (esposti su WebHttpBinding). –

0

Come legare in modo affidabile un utente con un indirizzo IP specialmente se l'utente è dietro un NAT ISP (o NAT aziendale), si otterrà solo l'indirizzo IP pubblico dell'ISP. Invece, per quanto riguarda l'identificazione dell'utente che utilizza una chiave API (che fanno molti major come Google e Twitter) o con altri mezzi (come il certificato client) e quindi traccia l'utilizzo in un archivio di persistenza per la limitazione.

Un'altra opzione sarebbe quella di introdurre questo tipo di meccanismo delle restrizioni per l'indirizzo IP a livello di rete che utilizzano le regole del firewall (io non sono esperto per ammesso che sia possibile)

+0

Il servizio Web sarà accessibile direttamente tramite banner pubblicitari. Non c'è possibilità di assegnare una chiave specifica per ogni utente. Sono consapevole dei pericoli della limitazione della PI, ma è tutto ciò che abbiamo in questo momento. – Chris

+0

Ok, quindi, che ne è la possibilità di limitare le richieste tramite IP utilizzando una sorta di firewall o sistema di rilevamento delle intrusioni anziché a livello di applicazione. – softveda