正確な IP 範囲からのみ Web アプリケーションに到達できるようにしたいと考えています。
クライアント IP が WEB.Config アプリケーションに保存されている範囲にない場合、ページへのアクセスを拒否する必要があります。
正確な IP 範囲からのみ Web アプリケーションに到達できるようにしたいと考えています。
クライアント IP が WEB.Config アプリケーションに保存されている範囲にない場合、ページへのアクセスを拒否する必要があります。
Azure Web Apps (以前の Azure Web サイト) は、これをしばらくの間サポートしています。これは IIS の機能であり、Azure Web Apps は、ipSecurity要素を web.config に追加することで利用できるようにします。これを行うためにコードを記述する必要はありません。
Azure Web Apps の機能について説明しているブログと、構成を web.config に追加する方法のサンプルを次に示します。
http://azure.microsoft.com/blog/2013/12/09/ip-and-domain-restrictions-for-windows-azure-web-sites/
これらの IP 範囲を Web.config に追加する方法
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="IP" value="31.171.126.0/255,31.171.127.0/255"/>
</appSettings>
<system.web>
<customErrors mode="Off"/>
<compilation debug="true"/>
<authentication mode="None"/>
</system.web>
</configuration>
コードビハインドのしくみ:
protected void Page_Load(object sender, EventArgs e)
{
var allowed = false;
//Get IP ranges from Web.config
// AS you see in web.config different IP ranges is seperated by comma
var ip = ConfigurationManager.AppSettings["IP"];
// Get Client Ip
lblIp.Text = GetIpAddress().Split(':')[0];
var clientIp = GetIpAddress();
var list = ip.Split(',');
//Do search inside IP ranges and see if client IP is inside IP ranges which is allowed to open web app.
foreach (var item in list)
{
var range = Convert.ToInt32(item.Split('/')[1].ToString(CultureInfo.InvariantCulture));
for (var i=0; i <= range; i++)
{
var submaskip = item.Split('/')[0].Split('.')[0] + "." + item.Split('/')[0].Split('.')[1] + "." +
item.Split('/')[0].Split('.')[2] + "." + i;
if (clientIp == submaskip)
{
allowed = true;
}
}
}
if (allowed == false)
{
Response.Redirect("Denied.aspx");
}
}
// Get Client IP
protected string GetIpAddress()
{
var context = System.Web.HttpContext.Current;
var ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(ipAddress)) return context.Request.ServerVariables["REMOTE_ADDR"];
var addresses = ipAddress.Split(',');
return addresses.Length != 0 ? addresses[0] : context.Request.ServerVariables["REMOTE_ADDR"];
}