0

私は、1 つの Web サーバーと、XML を Web サーバーに投稿する 1 つの C# クライアントを持つアプリケーションを開発しています。Web サーバーは、クライアントのローカル IP アドレスを知る必要があります。サーバー側で IP アドレスを取得する方法を試しましたが、プロキシ サーバーまたは NAT が間にある場合、これらの方法ではクライアントの IP アドレスが得られません。そのため、クライアント アプリケーションで接続のローカル IP を見つけて、それを要求と共に送信する必要があります。

問題は にありHttpWebRequestます。HTTP リクエストの送信中に行われた接続のローカル IP アドレスを取得する方法がわかりません。

明確化:
私の場合のクライアントはブラウザベースではありません。C#アプリケーションです。私のサーバーには、ローカル IP に基づく特定のルールがあり、HTTP 要求の送信中にサーバーに接続するために使用されていました。私の場合、ローカル IP は固定です。Socketローカル マシンには複数の IP が存在する可能性があります。そのため、リクエストの送信に使用される に関連付けられたローカル IP が必要です。これはTcpClient、C# で使用し、その上に HTTP プロトコルを実装すれば解決できますが、それは避けたいと考えています。HttpWebRequestそれで、リクエストを投稿する前に関連するソケットを取得する方法はありますか?

4

4 に答える 4

1

HttpWebRequestが使用する接続のローカルIPアドレスを取得することはできません。ただし、DNSまたはSystem.Net.NetworkInformationクラスを使用して、すべてのローカルIPアドレスを取得し、それらをカスタムヘッダーとして要求とともに送信することができます。サーバー側では、このヘッダーを解析して、期待しているIPと一致するIPがあるかどうかを確認できます。

ただし、Damienが上記で示したように、このソリューションは絶対確実ではなく、サーバーが期待しているIPアドレスになりすます可能性があります。たぶん、一歩下がって、これによってどのようなセキュリティを達成しようとしているのかを考える必要がありますか?また、別の方法で目標を達成できるかどうかを確認してください。たとえば、Basic(over HTTPS)、Digest、NTLM、Kerberos、Negotiateなどのサポートされている方法を使用したユーザー認証、またはクライアント証明書でのSSLの使用などです。

于 2009-11-24T21:07:27.963 に答える
0

これを行う保証された方法はありません。Javascriptとサーバー側のコードは、ローカルアドレスではなく、パブリックアドレスのみを表示できます。Java(ここで説明)を使用して取得する方法がありますが、JavascriptとJavaの両方が使用可能であり、ユーザーのブラウザーがその特定の呼び出しをサポートしていることに依存しています。

必要に応じて多くのローカルIPが割り当てられていることを考えると(自宅のPCはDHCPを使用して割り当てられ、職場のPCも時々変更されます)、ローカルIPを知っていることは実際に役立つと思いますか?

于 2009-11-24T08:14:54.900 に答える
0

XML を回線経由で送信する場合は、HttpWebRequest から SOAP 要求/応答に移行する必要があります。ASPX Web サービスまたは WFC Web サービスを実装します。HttpWebRequest は、それらを発行した最後の IP から送信されているため、常にサーバーに表示されます。これは NAT またはプロキシになります。

ただし、サーバー側でローカル マシンの IP を知る必要があるのは、私も奇妙だと思います。

于 2009-11-24T21:13:37.843 に答える
0

考えられる解決策の 1 つは、サーバーに接続するときに使用する IP をクライアントに伝え、その IP をサーバーが読み取れるようにカスタム ヘッダーに含めることです。

var srcip = IPAddress.Parse("10.0.0.1");
var request = (HttpWebRequest)HttpWebRequest.Create ("http://example.com/");
request.Headers.Add("X-Original-Client-IP", srcip.ToString());
request.ServicePoint.BindIPEndPointDelegate = delegate { return new IPEndPoint(srcip, 0); };
request.GetResponse();
于 2013-09-04T00:58:58.947 に答える