程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> HttpModule實現系統IP訪問控制詳解

HttpModule實現系統IP訪問控制詳解

編輯:關於.NET

最近項目中的一個政務系統要求可配置的IP訪問控制,既然有這個需求我們自 然要滿足啦。

對於之前一篇中使用IHttpHandlerFactory驗證用戶經驗,這次使用 HttpModule來更早的檢測用戶。

如何來更好的判斷IP是否在允許的列表或者禁止的列表,基於目前IPV4,就干 脆IP的4位字段分別判斷,這樣也可簡單的批量IP網段設置。

系統中將配置保存到數據庫中,數據庫設計如下:

接下來就可編寫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 = @"
您的訪問受到限 制,請與系統管理員聯系。
";
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 ipList =  GetList(null);
//IP允許列表
List 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  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配置:

配置列表:

當訪問受到限制時,系統返回如下:

然後配置web.config中httpModules節點,由於用戶每次訪問系統都要檢查, 導致每次都會查詢數據庫中的配置。系統中數據訪問是通過Hxj.Data來實現的, 即可通過配置Hxj.Data的緩存配置來減輕數據庫的壓力。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved