محدود کردن درخواست های Asp.Net Web Api بر اساس Client IP
نویسنده: مسعود پاکدل
تاریخ: ۱۳۹۳/۰۶/۲۸ ۱۷:۱۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
if (request.Properties.ContainsKey["MS_HttpContext"])
{
var ctx = request.Properties["MS_HttpContext"] as HttpContextWrapper;
if (ctx != null)
{
var ip = ctx.Request.UserHostAddress;
}
} public static class HttpRequestMessageExtensions
{
private const string HttpContext = "MS_HttpContext";
public static string GetClientIpAddress(this HttpRequestMessage request)
{
if (request.Properties.ContainsKey(HttpContext))
{
dynamic ctx = request.Properties[HttpContext];
if (ctx != null)
{
return ctx.Request.UserHostAddress;
}
}
return null;
}
} if (request.Properties.ContainsKey[RemoteEndpointMessageProperty.Name])
{
var remote = request.Properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
if (remote != null)
{
var ip = remote.Address;
}
} public static class HttpRequestMessageExtensions
{
private const string HttpContext = "MS_HttpContext";
private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty";
public static string GetClientIpAddress(this HttpRequestMessage request)
{
if (request.Properties.ContainsKey(HttpContext))
{
dynamic ctx = request.Properties[HttpContext];
if (ctx != null)
{
return ctx.Request.UserHostAddress;
}
}
if (request.Properties.ContainsKey(RemoteEndpointMessage))
{
dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];
if (remoteEndpoint != null)
{
return remoteEndpoint.Address;
}
}
return null;
}
} public class MyHandler : DelegatingHandler
{
private readonly HashSet<string> deniedIps;
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (deniedIps.Contains(request.GetClientIpAddress()))
{
return Task.FromResult( new HttpResponseMessage( HttpStatusCode.Unauthorized ) );
}
return base.SendAsync(request, cancellationToken);
}
} public class Startup
{
public void Configuration( IAppBuilder appBuilder )
{
var config = new HttpConfiguration();
var routeHandler = HttpClientFactory.CreatePipeline( new HttpControllerDispatcher( config ), new DelegatingHandler[]
{
new MyHandler(),
} );
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "{controller}/{action}",
defaults: null,
constraints: null,
handler: routeHandler
);
config.EnsureInitialized();
appBuilder.UseWebApi( config );
}
} public class IpMiddleware : OwinMiddleware
{
private readonly HashSet<string> _deniedIps;
public IpMiddleware(OwinMiddleware next, HashSet<string> deniedIps) :
base(next)
{
_deniedIps = deniedIps;
}
public override async Task Invoke(OwinRequest request, OwinResponse response)
{
var ipAddress = (string)request.Environment["server.RemoteIpAddress"];
if (_deniedIps.Contains(ipAddress))
{
response.StatusCode = 403;
return;
}
await Next.Invoke(request, response);
}
} public class Startup
{
public void Configuration( IAppBuilder appBuilder )
{
var config = new HttpConfiguration();
var deniedIps = new HashSet<string> {"192.168.0.100", "192.168.0.101"};
app.Use(typeof(IpMiddleware), deniedIps);
appBuilder.UseWebApi( config );
}
} Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
Request.ServerVariables["REMOTE_ADDR"]