最近項目中的一個政務系統要求可配置的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的緩存配置來減輕數據庫的壓力。