ASP.NET Core - Bloqueando endereços IP - II
 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:

É 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:


José Carlos Macoratti