Uzyskiwanie adresu IP klienta w programie WCF 3.0


82

Najwyraźniej można łatwo uzyskać adres IP klienta w programie WCF 3,5, ale nie w programie WCF 3,0. Czy ktoś wie jak?

Odpowiedzi:


152

To nie pomaga w wersji 3.0, ale widzę, jak ludzie znajdują to pytanie i są sfrustrowani, ponieważ próbują uzyskać adres IP klienta w wersji 3.5. Oto kod, który powinien działać:

using System.ServiceModel;
using System.ServiceModel.Channels;

OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint =
    prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;

11
Nie mogłem edytować posta, ale bardzo mi to pomogło, dzięki! Chciałbym wspomnieć, że są 2 błędy. Powinien mieć wartość „OperationContext” zamiast „OperationContent” oraz „RemoteEndpointMessageProperty” zamiast „RemoveEndpointMessageProperty”.
Jeremy Mullin

3
Uwaga dotycząca bezpieczeństwa: Tę wartość można sfałszować ... zobacz MSDN
półbita

@ makerofthings7 Widzę to w MSDN, ale czy naprawdę można to sfałszować? Żądanie nadal ma uzgadnianie TCP. Gdyby adres IP był naprawdę sfałszowany, czy potwierdzenie synchronizacji nie zostało wysłane w niewłaściwe miejsce, a zatem połączenie nie powiodłoby się, zanim jeszcze się rozpoczęło?
kosztował

1
@cost „IP” w tym przypadku znajduje się nie tylko w pakiecie TCP, ale także rezyduje w komunikacie WCF, jednak ten tekst w strumieniu danych (warstwa 7) nie jest odpowiednio zabezpieczony ”
półbita

1
@shambulator Minęło kilka lat, odkąd widziałem ten problem, ale następujący artykuł KB wydaje się wskazywać, że mogły to być porty, a nie ipaddresses. support.microsoft.com/kb/971842
halfbit

36

Okazuje się, że możesz, o ile (a) Twoja usługa jest hostowana w usłudze sieci Web (oczywiście) i (b) włączysz tryb AspNetCompatibility w następujący sposób:

    <system.serviceModel>
            <!-- this enables WCF services to access ASP.Net http context -->
            <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
...
    </system.serviceModel>

Następnie możesz uzyskać adres IP poprzez:

HttpContext.Current.Request.UserHostAddress

11
A potem dostajesz to za pomocąHttpContext.Current.Request.UserHostAddress
Jader Dias

3
Ostrzegam, że to pociąga za sobą cały zestaw problemów
user1496062,

15

Można to zrobić, jeśli jest przeznaczona dla platformy .NET 3.0 z dodatkiem SP1.

OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint = prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;

Kredyty: http://blogs.msdn.com/phenning/archive/2007/08/08/remoteendpointmessageproperty-in-wcf-net-3-5.aspx

Źródła: http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.remoteendpointmessageproperty.aspx


3
Ok, wygląda na to, że otrzymuję IPv6, takie jak „fe80 :: 3dbc: a2ec”. Zastanawiałem się, jak mogę uzyskać zdalny numer IP
Junior Mayhé

@ makerofthings7 czego powinniśmy używać przy podejmowaniu decyzji dotyczących bezpieczeństwa?
CSharper
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.