Abrufen der Client-IP-Adresse in WCF 3.0


82

Anscheinend können Sie leicht eine Client-IP-Adresse in WCF 3.5 erhalten, aber nicht in WCF 3.0. Weiß jemand wie?

Antworten:


152

Dies hilft Ihnen in 3.0 nicht weiter, aber ich kann nur sehen, dass Leute diese Frage finden und frustriert sind, weil sie versuchen, die Client-IP-Adresse in 3.5 zu erhalten. Also, hier ist ein Code, der funktionieren sollte:

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
Ich konnte den Beitrag nicht bearbeiten, aber es hat mir sehr geholfen, danke! Wollte erwähnen, dass es 2 Fehler gibt. Sollte "OperationContext" anstelle von "OperationContent" und "RemoteEndpointMessageProperty" anstelle von "RemoveEndpointMessageProperty" sein.
Jeremy Mullin

3
Sicherheitshinweis: Dieser Wert kann gefälscht werden ... siehe MSDN
goodguys_activate

@ makerofthings7 Ich sehe das auf MSDN, aber könnte es wirklich gefälscht werden? Die Anfrage hat noch einen TCP-Handshake. Wenn die IP-Adresse wirklich gefälscht wäre, würde die Synchronisierung dann nicht an den falschen Ort gesendet, und die Verbindung würde fehlschlagen, bevor sie überhaupt begonnen hat?
Kosten

1
@cost Die "IP" befindet sich in diesem Fall nicht nur im TCP-Paket, sondern befindet sich auch in der WCF-Nachricht. Dieser Text im Datenstrom (Schicht 7) ist jedoch nicht ordnungsgemäß gesichert. '
goodguys_activate

1
@shambulator Es ist einige Jahre her, seit ich das Problem gesehen habe, aber der folgende KB-Artikel scheint darauf hinzudeuten, dass es sich möglicherweise um Ports und nicht um IP-Adressen handelt. support.microsoft.com/kb/971842
goodguys_activate

36

Es stellt sich heraus, dass Sie dies können, solange (a) Ihr Dienst (offensichtlich) in einem Webdienst gehostet wird und (b) Sie den AspNetCompatibility-Modus wie folgt aktivieren:

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

Und dann können Sie die IP-Adresse erhalten durch:

HttpContext.Current.Request.UserHostAddress

11
Und dann bekommen Sie es mitHttpContext.Current.Request.UserHostAddress
Jader Dias

3
Seien Sie gewarnt, dies
bringt

15

Sie können, wenn Sie auf .NET 3.0 SP1 abzielen.

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

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

Referenz: http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.remoteendpointmessageproperty.aspx


3
Ok, ich sehe aus wie ein IPv6 wie "fe80 :: 3dbc: a2ec". Ich war auf der
Suche,

@ makerofthings7 Was sollten wir verwenden, wenn wir Sicherheitsentscheidungen treffen?
CSharper
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.