2008-12-24 7 views
24

Existe-t-il un moyen d'obtenir l'adresse IP distante d'une connexion WCF? Je suppose que la raison pour laquelle il n'est pas intégré dans l'infrastructure WCF est que WCF peut fonctionner avec des liaisons non TCP/IP, donc l'adresse IP n'est pas toujours significative. Cependant, l'information aurait du sens pour toutes les liaisons largement utilisées (autant que je sache: BasicHttp, DualHttp, WSHttp et NetTcp).Comment obtenir l'adresse IP d'un point de terminaison distant WCF?

L'adresse IP est probablement accessible à l'aide de la réflexion, mais je préfère trouver une façon documentée de l'obtenir plutôt que de pirater les classes du framework. J'ai cherché sur le sujet, et il semble que beaucoup de gens l'ont rencontré sans trouver une solution décente (La réponse habituelle est to rely on the message headers, mais cela implique de faire confiance au client pour fournir sa véritable adresse IP, qui est n'est pas une option si vous voulez enregistrer l'adresse IP pour des raisons de sécurité)

Répondre

14

Apparemment, il a été ajouté en 3.5 via RemoteEndpointMessageProperty; voir here.

+0

le message dit que cela peut être usurpé, mais je ne peux pas comprendre si elles parlent d'usurpation IP classique (en utilisant syn/acks) ou si elles signifient que l'information est fournie par l'application wcf à distance. Je pense que c'est plutôt le premier parce que l'adresse que nous obtenons est l'adresse proxy/relais. Un indice à ce sujet? – Brann

+0

Désolé, non je ne sais pas. –

+0

L'exemple produit l'IP au format IPv6 - quelqu'un sait comment le convertir en une adresse IPv4? – user141682

2

Si vous êtes du côté service et que vous souhaitez obtenir l'adresse IP du client, vous devez vérifier les propriétés de message de OperationContext. regarder here ou h ere par exemple

+0

Si je ne me trompe, cela implique la confiance du client (voir la fin du premier poste lié: « Nous ne faisons aucune sorte de détection spoof, alors faites attention à l'aide de l'IP pour toute sorte des décisions de sécurité. ") Je préfère accéder à ma propre socket et récupérer l'adresse IP à laquelle elle est connectée. – Brann

3
OperationContext context = OperationContext.Current; 
MessageProperties properties = context.IncomingMessageProperties; 
RemoteEndpointMessageProperty endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; 
string address = endpoint.Address; 
+1

Cet exemple est celui qui a fonctionné pour moi le mieux. Merci. –

Questions connexes