对于一些企业内部核心系统,特别是外网访问的时候,为了信息安全,可能需要对外部访问的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. java json字符串和对象互转

    /** * Created by admin on 2017/7/26. */ public class NewPost { private String title; private String ...

  2. 一起talk C栗子吧(第八十七回:C语言实例--使用管道进行进程间通信概述)

    各位看官们,大家好.上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信. 闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的的章回中介绍了使用管道进行进程 ...

  3. Java并发编程(三)概念介绍

    在构建稳健的并发程序时,必须正确使用线程和锁.但是这终归只是一些机制.要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问. 对 ...

  4. 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 ...

  5. Swoole系列(三):建立TCP服务器并发送数据测试

    <?php // 建立tcp服务器下 $host = '0.0.0.0'; $port = 9501; $serv = new swoole_server($host,$port); $serv ...

  6. windows下mysql区分大小写敏感问题

    默认情况下,表别名在Unix上区分大小写,但在Windows或macOS上不是这样.以下语句在Unix上不起作用,因为它引用别名as a和as A: mysql> SELECT col_name ...

  7. 基于 UML 的业务建模举例

    简介: 对于管理流程咨询项目.大型信息化建设项目和套装管理软件实施项目,对业务环境的分析和理解对项目的成功至关重要.系统.全面理解 IT 系统所处的业务环境,可以帮助 IT 系统能提供正确系统功能,并 ...

  8. Mybatis 逆向工程 自动生成代码

    Mybatis 可以通过一定的代码,自动生成包括mapper.xml.mapper.java.po等文件: 一.环境准备: 用到的JAR包如下: 文件只有两个:GenMain.java和generat ...

  9. Win7机器上安装Ubuntu 14.0.4

    折腾了两天,分享一下经历. 我须要在已经安装了win7的机器上安装Ubuntu 14.0.4 (两者共存),研究下来有例如以下几种方案, 都折腾了一遍.分享一下经验: 方式1: wubi.exe, 把 ...

  10. 微信小程序 缓存说明

    每个微信小程序都可以有自己的本地缓存,可以通过 wx.setStorage(wx.setStorageSync).wx.getStorage(wx.getStorageSync).wx.clearSt ...