对于一些企业内部核心系统,特别是外网访问的时候,为了信息安全,可能需要对外部访问的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,欢迎各位加入交流。

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

  1. 一种基于自定义代码的asp.net网站首页根据IP自动跳转指定页面的方法!

    一种基于自定义代码的asp.net网站首页根据IP自动跳转指定页面的方法! 对于大中型网站,为了增强用户体验,往往需要根据不同城市站点的用户推送或展现相应个性化的内容,如对于一些大型门户网站的新闻会有 ...

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

    阅读目录 开始 配置OutputCache 启用内容过期 解决资源文件升级问题 启用压缩 删除无用的HttpModule 其它优化选项 本文将介绍一些方法用于优化ASP.NET网站性能,这些方法都是不 ...

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

    不修改代码就能优化ASP.NET网站性能的一些方法 阅读目录 开始 配置OutputCache 启用内容过期 解决资源文件升级问题 启用压缩 删除无用的HttpModule 其它优化选项 本文将介绍一 ...

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

    本文将介绍一些方法用于优化ASP.NET网站性能,这些方法都是不需要修改程序代码的.它们主要分为二个方面:1. 利用ASP.NET自身的扩展性进行优化.2. 优化IIS设置. 配置OutputCach ...

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

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源. ASP.NET中提供了连接池 ...

  6. 调试ASP.NET网站IIS环境问题解决方法汇总

    调试网站时出现错误,错误如下: 1. 分析器错误消息: 创建 RewriterConfig 的配置节处理程序时出错: 无法生成临时类(result=1).error CS2001: 未能找到源文件“C ...

  7. 论一种基于JS技术的WEB前端动态生成框图的方法

    前言 HTML是一种标记语言,由HTML的标签元素和文本编写的文档可被浏览器描述为一幅网页.通常情况下网页的实现是由HTML.CSS和Javascript三者结合完成的,HTML负责网页的结构,CSS ...

  8. asp.net 网站访问变慢

    资料一 单个网站解决方法:   把应用程序池回收时间缩短到300-600分钟,其间回收过程中,需要占用一点CPU资源,没办法,为了稳定性,再把回收时间设为凌晨5点. 多网站解决方法: 视服务器网站的多 ...

  9. Asp.Net 网站访问人数及在线人数

    利用Application对象和Session对象可以统计历史访问人数和当前在线人数. 在会话开始和结束时,一定要进行加锁和解锁操作.由于多个用户可以共享Application对象,因此加锁是必要的, ...

随机推荐

  1. python模块学习之__future__

    每个程序在更新版本之后,都会相较于上一个版本有所改动.这些改动会给程序的使用者造成不小的困扰! 比如python2.xx和3.xx的改动,足够让新手们头大了! 在3中, u'xxx'和'xxx'都是字 ...

  2. 配置linux服务器和pycharm的连接

    1.打开pyCharm Tools->Deployment->Configuratio Connecion ->Root Path: /home/admin/application/ ...

  3. inode表元数据,存储在物理存储体上

    一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规.目录.符号链接等),权限,文件大小,创建/修改/访问时间等,也就是ls -l命令看到的那些信息,这些信息存在inode中而不是 ...

  4. driver makefile

    1.单模块单文件//*********************************************obj-m := hello.o KDIR := /home/akaedu/kernel/ ...

  5. error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution

    解决编译php扩展xsl时出现 error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution ...

  6. Eclipse 创建 Java 项目

    打开新建 Java 项目向导 通过新建 Java 项目向导可以很容易的创建 Java 项目.打开向导的途径有: 通过点击 "File" 菜单然后选择 New > Java P ...

  7. ECharts:企业报表工具

    ECharts.纯Javascript图表库,基于Canvas,底层依赖ZRender.商业产品经常使用图表库,提供直观,生动.可交互,可个性化定制的数据可视化图表.创新的拖拽重计算.数据视图.值域漫 ...

  8. 百度-设置-搜索设置-每页显示50条-保存设置-打印alert信息-accept确定

    一.场景: 代码: #coding:utf-8from selenium import webdriverfrom selenium.webdriver.common.action_chains im ...

  9. 数据库的SQL模式

    1.定义:何为MySQL的严格模式,简单来说就是MySQL自身对数据进行严格的校验(格式.长度.类型等),比如一个整型字段我们写入一个字符串类型的数据,在非严格模式下MySQL不会报错,同样如果定义了 ...

  10. python3 - 闭包

    # 定义一个函数def test(number): # 在函数内部再定义一个函数,并且这个函数用到外边函数的变量, # 那么将这个函数以及用到的一些变量称之为 闭包. def text_in(numb ...