Hoje vamos continuar mostrando como bloquear endereços IP em uma aplicação ASP.NET Core Web API. |
Continuando o artigo anterior vamos implementar um
filtro Action para bloquear
IPs.
Os filtros na ASP.NET Core permitem que o código seja executado antes ou depois de estágios específicos no
pipeline de processamento do request.
Os filtros lidam com tarefas como:
Autorização, ou acesso a recursos para quais usuários um usuário não está autorizado.
Cache de resposta, curto-circuito do pipeline do request para retornar uma resposta em cache.
É possível criar filtros personalizados para lidar com interesses paralelos. Entre os exemplos de interesses paralelos estão o tratamento de erros, cache, configuração, autorização e registro em log. Os filtros evitam a duplicação do código. Por exemplo, um filtro de exceção de tratamento de erro pode consolidar o tratamento de erro em sua aplicação.
Os filtros são executados dentro do pipeline de invocação de ações do ASP.NET Core, às vezes chamado de pipeline de filtros. O pipeline de filtro é executado após ASP.NET Core seleciona a ação a ser executada:
Tipos de filtros
Cada
tipo de filtro é executado em um estágio diferente no pipeline de filtros:
Os filtros dão suporte a implementações síncronas e assíncronas por meio de diferentes definições de interface.
Os filtros síncronos são executados antes e depois do estágio de pipeline. Por exemplo, OnActionExecuting é chamado antes que o método de ação seja chamado. OnActionExecuted é chamado depois que o método de ação retorna:
Vamos criar um filtro Action ou filtro de Ação para bloquear os IPs definidos.
Criando um filtro para bloquear
IPs
Crie uma pasta Filters no projeto da API e nesta pasta crie a classe IPBloqueioActionFilter que vai herdar da classe ActionFilterAttribute :
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
using ApiBloqueioIp.Services;
namespace ApiBloqueioIp.Filters;
public class IPBloqueioActionFilter : ActionFilterAttribute
{
private readonly IBloquearIPService _bloqueioService;
public IPBloqueioActionFilter(IBloquearIPService bloqueioService)
{
_bloqueioService = bloqueioService;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var remoteIp = context.HttpContext.Connection.RemoteIpAddress;
var estaBloqueado = _bloqueioService.EstaBloqueado(remoteIp!);
if (estaBloqueado)
{
context.Result = new StatusCodeResult(StatusCodes.Status403Forbidden);
return;
}
base.OnActionExecuting(context);
}
}
|
Primeiro, herdamos
da classe ActionFilterAttribute e a seguir
precisamos de nosso serviço IBloquearIPService
injetado no construtor.
Em seguida, sobrescrevemos o método OnActionExecuting()
e, como fizemos em nosso middleware, verificamos se
RemoteIpAddress está bloqueado, configurando
context.Result como Forbidden se estiver.
Finalmente, chamamos base.OnActionExecuting() para
garantir que o método da classe base seja chamado.
Além disso, precisamos registrar o filtro de ação como um serviço com escopo na
classe Program:
builder.Services.AddScoped<IPBloqueioActionFilter>();
Testando o Filtro Action
Agora que temos o filtro Action criado vamos ajustar o código da API incluindo o atributo apenas no endpoint da API que desejamos bloquear.
[Route("api/[controller]")]
[ApiController]
public class BloqueioIPController : ControllerBase
{
[HttpGet("desbloqueado")]
public string Desbloqueado()
{
return $"Acesso Desbloqueado para este endpoint : {DateTime.Now}";
}
[ServiceFilter(typeof(IPBloqueioActionFilter))]
[HttpGet("bloqueado")]
public string Bloqueado()
{
return $"Acesso BLOQUEADO para este endpoint : {DateTime.Now}";
}
}
|
Agora vamos comentar o código na classe Program que chamava o middleware que implementamos na primeira parte do artigo:
//app.UseMiddleware<BloquearIPMiddleware>();
Executando nosso projeto novamente e acessando o endpoint api/bloqueioip/desbloqueado recebemos o acesso Desbloqueado como esperamos.
No entanto, se tentarmos fazer um request para o endpoint
api/bloqueioip/bloqueado
,
receberemos um 403 Forbidden, devido ao nosso filtro Action.
Assim , mostramos duas formas diferentes de impedir que
endereços IP façam solicitações para nossos aplicativos, o que pode ser muito
útil quando queremos garantir que apenas uma determinada lista de usuários
acesse nosso aplicativo ou quando desejamos bloquear IPs conhecidos que são
suspeitos.
Pegue o código aqui : ApiBloqueioIp2.zip ...
"Disse-lhe Jesus: Estou há tanto tempo
convosco, e não me tendes conhecido, Filipe? Quem me vê a mim vê o Pai; e como
dizes tu: Mostra-nos o Pai? "
João 14:9
Referências: