首先是在global里加个Application_BeginRequest方法
void Application_BeginRequest(object sender, EventArgs e)
{
if (System.Web.HttpContext.Current.Request.Url.OriginalString.IndexOf("/admin/") != -1) //只有后台才进行检查
{
string ip = System.IO.File.ReadAllText(System.Web.HttpContext.Current.Server.MapPath("~/ip.txt")); //读取不要限制的IP地址
if (!isLimitIP(ip)) //存在ip地址段
{
System.Web.HttpContext.Current.Response.Redirect("~/error.aspx");
}
}
}
/// <summary>
/// 是否在限制IP段中
/// </summary>
/// <param name="strIP">ip段</param>
/// <returns>true 在,false 不在</returns>
public bool isLimitIP(string strIP)
{
if (strIP == "") //如果限定IP为空,那么肯定是不在此限制中的
{
return false;
}
string[] strsIP = null;
if (strIP.IndexOf('|') != -1) //如果当前IP段不是一个,则进行多个处理
{
strsIP = strIP.Split('|');
foreach (string str in strsIP)
{
if (isLimitIPNext(str)) //如果为ture 则在已经存在ip段中,直接返回true;
{
return true;
}
}
return false; //全部循环后,还没有退出,则肯定不存在,返回false
}
else
{
return isLimitIPNext(strIP);
}
}
/// <summary>
/// 是否在限制IP段中
/// </summary>
/// <param name="strIP">ip段</param>
/// <returns></returns>
private bool isLimitIPNext(string strIP)
{
if (strIP.IndexOf("-") != -1) //判断是否是IP段形式,如果是IP段形式,则自动过滤*形式
{
strIP = strIP.Replace("*", "1");
}
else
{
string beginIP = strIP.Replace("*", "1");
string endIP = strIP.Replace("*", "255");
strIP = beginIP + "-" + endIP;
}
string[] strsIP = strIP.Split('-'); //分割成单个IP
uint ipAddress = IPToInt(GetIP());
if (ipAddress >= IPToInt(strsIP[0]) && ipAddress <= IPToInt(strsIP[1])) //如果当前IP在IP段中,则返回true
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 获得当前页面客户端的IP
/// </summary>
/// <returns>当前页面客户端的IP</returns>
public static string GetIP()
{
string result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
if (string.IsNullOrEmpty(result))
result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(result))
result = HttpContext.Current.Request.UserHostAddress;
if (string.IsNullOrEmpty(result) || !IsIP(result))
return "127.0.0.1";
return result;
}
#region 判断是否为ip
/// <summary>
/// 是否为ip
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public static bool IsIP(string ip)
{
return Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
}
#endregion
#region IP地址转整数
/// <summary>
/// 地址转整数
/// </summary>
/// <param name="ipAddress"></param>
/// <returns></returns>
public static uint IPToInt(string ipAddress)
{
string disjunctiveStr = ".,: ";
char[] delimiter = disjunctiveStr.ToCharArray();
string[] startIP = null;
for (int i = 1; i <= 5; i++)
{
startIP = ipAddress.Split(delimiter, i);
}
string a1 = startIP[0].ToString();
string a2 = startIP[1].ToString();
string a3 = startIP[2].ToString();
string a4 = startIP[3].ToString();
uint U1 = uint.Parse(a1);
uint U2 = uint.Parse(a2);
uint U3 = uint.Parse(a3);
uint U4 = uint.Parse(a4);
uint U = U1 << 24;
U += U2 << 16;
U += U3 << 8;
U += U4;
return U;
}
#endregion
IP.txt 里内容
192.168.0.*|127.0.0.1|192.168.1.1-192.168.1.255
全部代码都在这里了 其实原理很简单 就是把IP转成整数再进行判断