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?
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
Sì, ma questa soluzione è generale per tutti i collegamenti basati su Http. WebOperationContext dovrebbe funzionare solo per i servizi REST (esposti su WebHttpBinding). –