HttpModule实现系统IP访问控制

最近项目中的一个政务系统要求可配置的IP访问控制,既然有这个需求我们自然要满足啦。

对于之前一篇中使用IHttpHandlerFactory验证用户经验,这次使用HttpModule来更早的检测用户。

如何来更好的判断IP是否在允许的列表或者禁止的列表,基于目前IPV4,就干脆IP的4位字段分别判断,这样也可简单的批量IP网段设置。

系统中将配置保存到数据库中,数据库设计如下:

image

接下来就可编写Httpmodule了,如下:

    public class IPHttpModule : IHttpModule
    {

        #region IHttpModule 成员

        public void Dispose()
        {

        }

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


        #endregion

        /// 
        /// 提示信息
        /// 
        const string ErrorHtml = @"//W3C//DTD HTML 4.01 Transitional//EN"">系统提示.ipforbidden
{
    border: #c0c0c0 1px dashed;
    font-size: 9pt;
    line-height: 20pt;
    padding-left: 10px;
    padding-top: 5px;
    padding-right: 10px;
    padding-bottom: 10px;
    margin-top: 15px;
    margin-bottom: 15px;
}
您的访问受到限制,请与系统管理员联系。
"; void context_BeginRequest( object sender, EventArgs e) { HttpApplication app = ( HttpApplication)sender; HttpContext context = app.Context; //判断是否IP限制 if (!CheckPermisssion(context.Request.UserHostAddress)) { context.Response.Write(ErrorHtml); context.Response.End(); } } }

下面是判断的代码:

/// 
/// 检测ip是否有访问系统的权限
/// 
/// 
/// public static bool CheckPermisssion(string ip)
{
    bool isallow = true;

    string[] tempipsection = ip.Split('.');

    int[] ipsection = new int[] { int.Parse(tempipsection[0]), int.Parse(tempipsection[1]), int.Parse(tempipsection[2]), int.Parse(tempipsection[3]) };

    List<Base_ip> ipList = GetList(null);


    //IP允许列表
    List<Base_ip> ipallowList = ipList.FindAll(delegate(Base_ip ipModel) { return ipModel.Iptype == 1; });
    
    foreach (Base_ip ipModel in ipallowList)
    {
        if (CheckPermisssion(ipsection, ipModel))
        {
            isallow = true;

            break;
        }
        else
        {
            isallow = false;
        }
    }

    if (!isallow)
        return isallow;


    //IP禁止列表
    List<Base_ip> ipnotallowList = ipList.FindAll(delegate(Base_ip ipModel) { return ipModel.Iptype == 2; });


    foreach (Base_ip ipModel in ipnotallowList)
    {
        if (CheckPermisssion(ipsection, ipModel))
        {
            isallow = false;

            break;
        }
    }

    return isallow;
}


/// 
/// 判断是否包含在内
/// 
/// 
/// 
/// private static bool CheckPermisssion(int[] ipsection, Base_ip ipModel)
{
    if (ipsection[0] < ipModel.Onefrom || ipsection[0] > ipModel.Oneend)
        return false;

    if (ipsection[1] < ipModel.Twofrom || ipsection[1] > ipModel.Twoend)
        return false;

    if (ipsection[2] < ipModel.Threefrom || ipsection[2] > ipModel.Threeend)
        return false;

    if (ipsection[3] < ipModel.Fourfrom || ipsection[3] > ipModel.Fourend)
        return false;

    return true;
}

代码其实也很简单,就不再具体讲述。

 

下面也截几张系统图。

添加IP配置:

image

 

配置列表:

image

 

当访问受到限制时,系统返回如下:

image

 

然后配置web.config中httpModules节点,

<add name="ipconfig" type="HttpModule.IPHttpModule,HttpModule"/>

 

 

 

由于用户每次访问系统都要检查,导致每次都会查询数据库中的配置。系统中数据访问是通过Hxj.Data来实现的,即可通过配置Hxj.Data的缓存配置来减轻数据库的压力。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-665465/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12639172/viewspace-665465/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值