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轉成整數再進行判斷
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章