8

答えはあると思いますthis is not possibleが、そうでない場合は...

私はASP .NET MVC 3アプリケーションを作成し、Request.UserHostNameプロパティを使用し、返された値をDns.GetHostEntryに渡して、現在接続されているクライアントのすべての可能な IP とホスト名を見つけています。次に例を示します。

var clientAddress = Request.UserHostName;
var entry = Dns.GetHostEntry(clientAddress);

Dns.GetHostEntry呼び出しから「ホストが見つかりません」というSocketExceptionが発生する場合を除いて、通常は問題ありません。

本当に奇妙なことは、Request.UserHostNameプロパティから返されるアドレスがパブリック アドレスでもプライベート アドレスでもないことです。これを証明するために、問題のクライアント マシンでこのコードを実行しました...

var host = Dns.GetHostEntry(Dns.GetHostName());

foreach (var a in host.Aliases)
{
    Console.WriteLine("alias '{0}'", a);
}

foreach (var a in host.AddressList)
{
    Console.WriteLine("ip address '{0}'", a);
}

// ...from http://stackoverflow.com/a/2353177/1039947...
String direction = "";
WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
using (WebResponse response = request.GetResponse())
{
    using (var stream = new StreamReader(response.GetResponseStream()))
    {
        direction = stream.ReadToEnd();
    }
}

int first = direction.IndexOf("Address: ") + 9;
int last = direction.LastIndexOf("</body>");
direction = direction.Substring(first, last - first);

Console.WriteLine("Public IP: '{0}'", direction);

3 つの IP アドレス (::1、1 つはプライベート、もう 1 つはパブリック) を出力しますが、どれもRequest.UserHostNameから返されるアドレスではありません。

上記のテスト アプリケーションから出力されたアドレスのいずれかをDns.GetHostEntryメソッドに渡すと、適切な値が返されます。

では、パブリックでもプライベートでもないこの奇妙な IP アドレスから、例外なくそのホスト エントリを取得できる (そしてこのアドレスは何ですか) 方法はありますか?

ところで、私が知る限り、HTTP メッセージには X_FORWARD_FOR ヘッダーなど、クライアントを識別できるものはありませんか?

質問の背景

それで、私がこれを求めている理由を説明すれば、おそらく誰かが別のアプローチを提供できるので、ここにいくつかの背景があると指摘されました(ダミアンに感謝します...

アプリケーションの管理者が、ページの表示を許可されている単一のマシン (IP アドレスまたはマシン名) を構成で指定できるようにする必要があるという要件があります。マシン名の要件はおそらく削除できますが、構成内の IP アドレスは、マシン名に対して ping を実行したときに返される IP アドレスを使用するため、UserHostName プロパティから返される IP アドレスとは一致しません。

したがって、私の考えでは、HTTP ヘッダーで送信されたものをすべて取り、それを GetHostEntry に渡し、そこから考えられるすべての結果 (すべての IP とホスト名) を取得し、それらのいずれかが構成された値と一致するかどうかを確認します。 「許可する」と言うことができ、それ以外の場合は「許可しない」と言うことができます(その不測の事態をカバーするために、最初のドットの前のホスト名の部分も削除するつもりでした). このスキームは、IP アドレスが私が期待するものとはまったく異なるこの状況によって水から吹き飛ばされました。

4

3 に答える 3

8

クライアントのホスト名は、HTTP レベルで送信されないため、通常はわかりません。サーバーはそれを知ることができません。Fiddler で HTTP リクエストを見て、サーバーが利用できる情報が多くないことを確認してください (もちろん、クライアントはすべてのリクエスト コンテンツを偽造できます)。

プロパティを使用しUserHostAddressて IP アドレスを取得します。それはあなたが確実に見つけることができる最大のものです。それができたら、IP をホスト名に逆にすることを試みることができますが、それが常に可能であるとは限りません。

于 2012-11-28T15:10:20.920 に答える