using System;
using System.Net;
using System.Web;
using System.Web.Caching;
namespace IpBlocker
{
public class IpBlocker : IHttpModule
{
private int hits = 0;
/// <summary>
/// Define enum to specify visite type
/// </summary>
private enum VisiteType
{
FirstVisite = 2,
Reviste = 4,
}
public void Init(HttpApplication context)
{
context.BeginRequest += OnBeginRequest;
}
public void Dispose()
{
}
public void OnBeginRequest(object sender, EventArgs e)
{
var httpApplication = sender as HttpApplication;
var httpContext = httpApplication?.Context;
ProcessRequest(httpApplication, httpContext);
}
private void ProcessRequest(HttpApplication application, HttpContext httpContext)
{
//Checke if browser is a search engine web crawler
if (httpContext.Request.Browser.Crawler)
return;
var ipAddress = application.Context.Request.UserHostAddress;
if (httpContext.Cache[ipAddress] == null)
{
// Reset hits for new request after blocking ip
if (hits > 0)
hits = 0;
hits++;
httpContext.Cache.Insert(key: ipAddress,
value: hits,
dependencies: null,
absoluteExpiration: DateTime.UtcNow.AddSeconds(1),
slidingExpiration: Cache.NoSlidingExpiration);
return;
}
else
{
if (httpContext.Cache[ipAddress] != null)
{
hits++;
if (hits == (int)VisiteType.FirstVisite)
{
httpContext.Cache.Insert(key: ipAddress,
value: hits,
dependencies: null,
absoluteExpiration: DateTime.UtcNow.AddSeconds(1),
slidingExpiration: Cache.NoSlidingExpiration);
return;
}
if (hits == (int)VisiteType.Reviste)
{
httpContext.Cache.Insert(key: ipAddress,
value: hits,
dependencies: null,
absoluteExpiration: DateTime.UtcNow.AddSeconds(1),
slidingExpiration: Cache.NoSlidingExpiration);
return;
}
if (hits > (int)VisiteType.Reviste)
{
httpContext.Cache.Insert(key: ipAddress,
value: hits,
dependencies: null,
absoluteExpiration: DateTime.UtcNow.AddMinutes(1),
slidingExpiration: Cache.NoSlidingExpiration);
httpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
httpContext.Response.SuppressContent = true;
httpContext.Response.End();
}
}
}
}
}
}
در وب کانفیگ اونو معرفی کردم ولی اصلا نمیشناسه