Edited at

ASP.NET CoreでIPv6/IPv4のどちらで接続しているかを表示した

More than 1 year has passed since last update.


はじめに

筆者はQiita初投稿、プログラミング初心者です。そのためこの記事は誤りや所謂クソコードを含んでいる可能性があります。

環境はVisual Studio 2017、CentOS7.5、Nginx1.12.2、ASP.net Core 2.0です。


何がしたいのか

IPv6とIPv4のどちらをユーザーが使用しているか、ユーザーが確認できるようにしたい。

要はIIJのこれ


方針

ユーザーのIPアドレスを取得して処理を行いたいがリバースプロキシとしてNginxを通している。そのため、おそらくこのまま実装するとループバックアドレスが帰ってくるはずである。そこでNginxのXFF(X-Forwarded-For)機能を利用することにする。

また、_Layout.cshtmlに書きたかったのでcshtmlだけで完結させ、csは使わないようにする。


問題点

ASP.net(Coreじゃない方)で動作するものは情報が多かったがASP.net Coreでは私が見つけられた情報はかなり少なかった。


XFFとは

プロキシサーバーからウェブサーバーに接続元のIPアドレスを伝えるためのHTTPヘッダフィールドで、これを利用することで間にNginxを挟んだ状態でユーザーのIPアドレスを取得することが可能になる。


実際の実装


ASP.NET Core


Startup.cs

StartupでASP.NET CoreのXFF機能を有効化する。

一番最初

using Microsoft.AspNetCore.HttpOverrides;

Configure関数のUseMvc()呼び出しの前

XFFの有効化を行う。

app.UseForwardedHeaders(new ForwardedHeadersOptions

{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});


hogehoge.cshtml

表示される部分を作る

一番最初

以下で利用するHTTPContextAccessorの依存性注入を行う。

@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor

表示する部分

ユーザーのIPアドレスの種類を見てIPv6/IPv4を判別、文字列として表示する。画像が用意できたら文字列ではなく画像を貼っても良いと思う。

if文はサーバーで実行されソースは動的に生成されるため、ユーザーからソースを見てもどちらか片方しか記載されていないように見える。

@{if(HttpContextAccessor.HttpContext.Connection.RemoteIpAddress.AddressFamily.ToString() == "InterNetworkV6" )

{
<p>connected via IPv6!</p>
}else
{
<p>connected via IPv4</p>
}


Nginx

リバースプロキシの設定が書いてある部分の近くに以下を追記

proxy_set_header X-Forwarded-for $remote_addr;


参考

以下のwebサイト様を参考にさせていただきました。ありがとうございます。

Nginx + ASP.NET CoreでクライアントのIPアドレスを取得する

https://qiita.com/kirishu/items/43ee8d91acbafa8259e6