aspx限制IP訪問
首先是在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轉成整數再進行判斷
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.