36 lines
1.0 KiB
C#
36 lines
1.0 KiB
C#
using Flawless.Server.Services;
|
|
|
|
namespace Flawless.Server.Middlewares;
|
|
|
|
public class IpFilterMiddleware : IDisposable
|
|
{
|
|
private readonly RequestDelegate _next;
|
|
private readonly IServiceScope _subScope;
|
|
private readonly AccessControlService _accessControl;
|
|
|
|
public IpFilterMiddleware(RequestDelegate next, IServiceProvider provider)
|
|
{
|
|
_next = next;
|
|
_subScope = provider.CreateScope();
|
|
_accessControl = _subScope.ServiceProvider.GetRequiredService<AccessControlService>();
|
|
}
|
|
|
|
public async Task InvokeAsync(HttpContext context)
|
|
{
|
|
var ip = context.Connection.RemoteIpAddress?.ToString();
|
|
|
|
if (string.IsNullOrEmpty(ip) || !await _accessControl.IsIpAllowedAsync(ip))
|
|
{
|
|
context.Response.StatusCode = StatusCodes.Status403Forbidden;
|
|
await context.Response.WriteAsync($"IP access is denied. Your IP: {ip}");
|
|
return;
|
|
}
|
|
|
|
await _next(context);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
_subScope.Dispose();
|
|
}
|
|
} |