ASP.NET Visual Studio

ASP.NETでクライアントIPを取得する

ASP.NET
2019/12/24 追記
ご指摘がありました。ありがとうございます。
最後の getClientIPV4() はWebサーバーのIPを返すのではと。
実際、アクセス元クライアントIPではなくWebサーバー のIPでした。
WEBサーバーでVisual Studio のデバッグ時 この getClientIPV4()を使用したとき
IPV4取得できたので、勘違いしました。現在は このgetClientIPV4()は使用しておりません。
従来通り UserHostAddress を使ってます。::1の問題は未解決でコードで127.0.0.1に変換してます。
2019/12/18 追記
今回の検証開発環境

  • Windows 10 Pro バージョン 1809 64ビット(物理PC)
  • Visual Studio 2008 Pro Version 9.0.30729.1 SP + IIS

System.Web.HttpContext.Current.Request.UserHostAddress Visual Studioデバッグ時のみ ::1を返す様です。Visual StudioインストールWebサーバー(IIS)のブラウザからのアクセスでは正常にアクセス元クライアントIPv4を返します。他のクライアントからのアクセスでも正常にアクセス元クライアントIPv4を返します。
現在までの結果より Visual Studio のデバッグOS環境に起因する?

  • Windows Server 2012R2(仮想),Windwos10(64ビット物理) デバッグ時 ::1
  • Windows Server 2012R2(仮想),Windwos10(64ビット物理) デバッグ機ブラウザからアクセス時 クライアントのIPV4
  • Windwos 7(32ビット物理) デバッグ時、ブラウザからのアクセス関係なく クライアントのIPV4

今のところ、OSの設定に寄って ::1 の取得を 127.0.0.1 に変更することは不可能の様です。
コードで ::1 → 127.0.0.1 に変換で行きます。

UserHostAddress が ::1 (IPv6)になってしまう

IPv4を取得したいのだが

開発環境

  • Windows Server 2012 R2
  • Visual Studio Community 2017
  • Asp.net 2.0 3.5 4.5

アクセス元クライアントIPをIPv4で取得できない

System.Web.HttpContext.Current.Request.UserHostAddress で取得するも ::1 になってしまう
::1 は localhost のIPv6でありIPv4 127.0.0.1を取得したい

Visual Studio 2008 まではIPv6の無効化で対応できた

その手順は

「ネットワークと共有センター」でIPv6のチェックを外す

 

レジストリエディタで HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\DisabledComponents を 0xFF に変更

 

レジストリ値を 0x20 (IPv6 よりも IPv4 を優先する ) 等いろいろやったがどうしてもIPv6を取得してしまう

 

netsh interface ipv6 show prefixpolicies で確認すると IPv4がIPv6より優先されているのだが?

はまったので取り敢えずコードで対応

下のコードを追加してようやく アクセス元のIPv4アドレスを取得できた

Function getClientIPV4() As String
  Dim ipa As String = ""
  Dim iphEntry As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName())

  For Each ipAddr As System.Net.IPAddress In iphEntry.AddressList
     If ipAddr.AddressFamily = System.Net.Sockets.AddressFamily.InterNetwork Then
          ipa = ipAddr.ToString()
          Exit For
      End If
  Next
  Return ipa
End Function

所感

はまってしまったので、取り敢えずIPv4取得の関数を作って対応したのだが、ネットワーク周りの設定に不備があるのか?環境が Visual Studio 2008 から 2017 に、OSも2008 R2 から 2012 R2に、またオンプレからAzure上での開発案件なので この辺も関係あるのか?今後何か変化があったらブログりたいと思います。

コメント

  1. くらげ より:

    最後のコードはASP.NETのサイトにアクセスしてきたマシンのIP(クライアントIP)ではなく、ASP.NETのサイトを実行しているマシンのIP(ホストIP)を取得するコードになっているのでは?

    参考情報
    https://www.atmarkit.co.jp/fdotnet/dotnettips/778getmyipaddress/getmyipaddress.html
    http://www.4guysfromrolla.com/articles/071807-1.aspx
    https://codeday.me/jp/qa/20190401/522769.html