一种基于自定义代码的asp.net网站访问IP过滤方法!

对于一些企业内部核心系统,特别是外网访问的时候,为了信息安全,可能需要对外部访问的IP地址作限制,虽然IIS中也提供了根据IP地址或IP地址段进行限制或允许,但并没有提供根据IP地址所在的城市进行限制或允许。本文主要通过自定义扩展IHttpModule接口,考虑到性能IP数据库主要采用QQwry纯真IP数据库(但此数据库并非是官方的,我之前与ip138网站对比过,IP地址信息的准确性大概在90%左右),主要实现不仅可以根据IP地址或IP地址段进行限制或允许(与IIS的功能相同),而且可以根据IP地址的所在城市进行限制或允许。该WebsiteFilter组件核心代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Xml;
using System.IO;
using System.Net;
using NetOpen_System.Component.QQWry;

namespace NetOpen_System.Component
{
    public sealed class WebsiteFilterHttpModule : IHttpModule
    {
        #region IHttpModule 成员

        public void Dispose()
        {
        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }

        #endregion

        void context_BeginRequest(object sender, EventArgs e)
        {
            try
            {
                //HttpApplication objApp = (HttpApplication)sender;

                if (HttpContext.Current.Request.IsLocal)//忽略本地计算机请求
                    return;

                string ip = HttpContext.Current.Request.UserHostAddress;

                QQWryLocator qqWry = new QQWryLocator(HttpContext.Current.Server.MapPath(@"~\IpData\qqwry.dat"));

                IPLocation ipaddress = qqWry.Query(ip);  //查询一个IP地址

                UrlMatchEngine pu = WebsiteFilterConfiguration.GetConfig().PickedUrls;

                if (string.IsNullOrEmpty(pu.CitySiteList) == false)
                {
                    if (pu.CitySiteList.Contains(ipaddress.Country) == false)
                    {

                        if (!WebsiteFilterConfiguration.GetConfig().IpChecks.GetIpIn(ip))
                        {   //若在IP列表中找不到访客ip

                            //string rawUrl = HttpContext.Current.Request.RawUrl;
                            //UrlMatchEngine pu = WebsiteFilterConfiguration.GetConfig().PickedUrls;

                            ////列表包含当前url且列表为黑名单、列表不包含当前url且列表不为黑名单  时需转向
                            ////换而言之,“配备结果”与“是否黑名单”取值一致时需转向
                            //if (pu.IsMatch(rawUrl) == pu.IsBlacklist)
                            //{   //非公开url自动重定向
                            //    HttpContext.Current.Response.Redirect(pu.ErrorPage);
                            //}
                            HttpContext.Current.Response.Redirect(pu.ErrorPage, true);
                            //HttpContext.Current.Server.Transfer(pu.ErrorPage);

                        }
                        else
                        {
                            return;
                        }
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    if (!WebsiteFilterConfiguration.GetConfig().IpChecks.GetIpIn(ip))
                    {   //若在IP列表中找不到访客ip

                        //string rawUrl = HttpContext.Current.Request.RawUrl;
                        //UrlMatchEngine pu = WebsiteFilterConfiguration.GetConfig().PickedUrls;

                        ////列表包含当前url且列表为黑名单、列表不包含当前url且列表不为黑名单  时需转向
                        ////换而言之,“配备结果”与“是否黑名单”取值一致时需转向
                        //if (pu.IsMatch(rawUrl) == pu.IsBlacklist)
                        //{   //非公开url自动重定向
                        //    HttpContext.Current.Response.Redirect(pu.ErrorPage);
                        //}
                        HttpContext.Current.Response.Redirect(pu.ErrorPage, true);
                        //HttpContext.Current.Server.Transfer(pu.ErrorPage);
                    }
                    else
                    {
                        return;
                    }
                }
            }
            catch
            {

            }
        }
    }
}

在部署方面,非常简单主要利用IHttpModule接口并在Web.config中的HttpModule节点添加此组件的配置,访问限制或允许参数可以在NetOpen_SystemWebsiteFilter.cfg.xml进行设置,以下为一个简单的配置示例;

<?xml version="1.0" encoding="utf-8" ?>
<NetOpen_System>
  <WebsiteFilter>
    <PickedUrl IsBlacklist="0" ErrorPage="~/sorry.htm" CitySiteList="浙江省宁波市,浙江省杭州市">
      <add pattern="^~/default.aspx"/>
    </PickedUrl>
    <PickedIP>
      <add ip1="192.168.10.1" ip2="192.168.10.5" />
      <remove ip1="192.168.10.2" ip2="192.168.10.4" />
      <add ip1="192.168.10.3" />
    </PickedIP>
  </WebsiteFilter>
</NetOpen_System>

该组件源代码下载地址:https://websitefilter.codeplex.com/,欢迎访问下载!虽然该组件实现并不复杂,原理也很简单,但较为实用,后续将增加根据IP138的网站进行实时查询,这样IP地址信息将更为精确,但对性能可能会有一些影响。


本博客为软件人生原创,欢迎转载,转载请标明出处:http://www.cnblogs.com/nbpowerboy/p/3160134.html。演绎或用于商业目的,但是必须保留本文的署名软件人生(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。SharePoint商业智能技术QQ群:140668362,.Net技术交流QQ群:195516928,欢迎各位加入交流

时间: 2024-08-01 10:45:51

一种基于自定义代码的asp.net网站访问IP过滤方法!的相关文章

不修改代码就能优化ASP.NET网站性能的一些方法

阅读目录 开始 配置OutputCache 启用内容过期 解决资源文件升级问题 启用压缩 删除无用的HttpModule 其它优化选项 本文将介绍一些方法用于优化ASP.NET网站性能,这些方法都是不需要修改程序代码的.它们主要分为二个方面:1. 利用ASP.NET自身的扩展性进行优化.2. 优化IIS设置. 回到顶部 配置OutputCache 用缓存来优化网站性能的方法,估计是无人不知的. ASP.NET提供了HttpRuntime.Cache对象来缓存数据,也提供了OutputCache指

26种提高ASP.NET网站访问性能的优化方法 .

1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源. ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响.系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求. 连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能.因此,在建立数据库连接后只有在真正需要操作时才打开连接,使用完

备案不关站方法:PHP代码屏蔽地区管局访问IP,不影响百度蜘蛛

1 <?php 2 function get_client_ip() { 3 if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) 4 $ip = getenv("HTTP_CLIENT_IP"); 5 else if (getenv("HTTP_X_FORWARDED_FOR"

ASP.net网站访问异常

解决方案 出现这个bug的原因是由于,net.framwork版本问题,以前PC上装的4.0版本,故会报错,安装net.framwork 4.5异常消失. END!

一种比较简单的在USB U盘中访问nandflash的方法

u8 nandflash_write_buffer[NAND_SERECT_FULL_SIZE]; static int currentBlock = -1; static int currentPage = -1; //带缓冲的nand读取,不支持跨扇区 void NAND_Read_Addr_Mal(u32 addr,u8* buffer,u32 length) { u32 i = 0; u32 readBlock = ((addr/NAND_SERECT_SIZE)/NAND_PAGE_N

转:通过代码理解Asp.net4中的几种ClientIDMode设置.

转:http://www.cnblogs.com/xray2005/archive/2011/07/05/2097881.html 以前我们可以通过ClientID在JavaScript脚本中服务器端控件.比如: document.getElementById("<%=控件.ClientID %>"); 这种方式不方便,而且如果在有数据绑定的控件中嵌套着子控件,则访问更不太方便了. 现在,在Asp.Net4中,对于控件增加了一种新的属性,名为ClientIDMode.通过设

十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)

十三种基于直方图的图像全局二值化算法原理.实现.代码及效果(转) http://www.cnblogs.com/carekee/articles/3643394.html 图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析.特征提取与模式识别之前的必要的图像预处理过程.这个看似简单的问题,在过去的四十年里受到国内外学者的广泛关注,产生了数以百计的阈值选取方法,但如同其他图像分割算法一样,没有一个现有方法对各种各样的图像都能得到令人满意的结果. 在这些庞大的分

基于DDD的现代ASP.NET开发框架--ABP系列之6、ABP依赖注入

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之6.ABP依赖注入 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 本文由 上海-半冷 提供翻译 什么是依赖注入 如果你已经知道依赖注入的概念,构造函数和属性注入模式

基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://gith