ASP.NET で IP アドレスを取得する必要がありますRequest.UserHostAddress
が、これは通常、ユーザーの ISP の IP アドレスであり、たとえばリンクをクリックしたユーザーのマシンの IP アドレスとはまったく同じではありません。実際の IP アドレスを取得するにはどうすればよいでしょうか?
たとえば、Stack Overflow のユーザー プロファイルでは、「最後のアカウント アクティビティ: 4 時間前、86.123.127.8 から」となっていますが、私のマシンの IP アドレスは少し異なります。Stack Overflow はこのアドレスをどうやって取得するのでしょうか?
一部の Web システムでは、何らかの目的で IP アドレス チェックが行われます。たとえば、特定の IP アドレスでは、ユーザーは 24 時間ごとにダウンロード リンクを 5 回だけクリックすることができます。この IP アドレスは一意である必要があります。膨大な数のクライアントやインターネット ユーザーを抱える ISP では、この IP アドレスは一意ではありません。
よく理解できましたか?
ベストアンサー1
多くの場合、Web サイトを訪問した人の IP アドレスを知りたいと思うでしょう。ASP.NET にはこれを実行するいくつかの方法がありますが、私たちが見た中で最も良い方法の 1 つは、ServerVariables コレクションの "HTTP_X_FORWARDED_FOR" を使用することです。
理由はこうです...
場合によっては、訪問者がプロキシ サーバーまたはルーターの背後にいるため、標準Request.UserHostAddress
ではプロキシ サーバーまたはルーターの IP アドレスのみが取得されます。この場合、ユーザーの IP アドレスはサーバー変数 ("HTTP_X_FORWARDED_FOR") に保存されます。
したがって、最初に「HTTP_X_FORWARDED_FOR」をチェックし、それが空の場合は単に返しますServerVariables("REMOTE_ADDR")
。
この方法は絶対確実ではありませんが、より良い結果をもたらす可能性があります。以下は、VB.NETのASP.NETコードです。James Crowley のブログ投稿「Gotcha: HTTP_X_FORWARDED_FOR が複数の IP アドレスを返す」
C#
protected string GetIPAddress()
{
System.Web.HttpContext context = System.Web.HttpContext.Current;
string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipAddress))
{
string[] addresses = ipAddress.Split(',');
if (addresses.Length != 0)
{
return addresses[0];
}
}
return context.Request.ServerVariables["REMOTE_ADDR"];
}
VB.NET
Public Shared Function GetIPAddress() As String
Dim context As System.Web.HttpContext = System.Web.HttpContext.Current
Dim sIPAddress As String = context.Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If String.IsNullOrEmpty(sIPAddress) Then
Return context.Request.ServerVariables("REMOTE_ADDR")
Else
Dim ipArray As String() = sIPAddress.Split(New [Char]() {","c})
Return ipArray(0)
End If
End Function