Novidades do .NET 7: Filters no tratamento de requisições em Minimal APIs

Renato Groffe
4 min readFeb 7, 2023

--

Middlewares estão presentes desde a primeira versão do ASP.NET Core, representando um dos pilares da arquitetura voltada a aplicações Web dentro da plataforma .NET. Funcionando como filtros para requisições HTTP recebidas e seguindo um fluxo em que um componente deste tipo poderá (ou não) repassar o processamento para o próximo elemento da pilha de execução, middlewares podem ser aplicados a todo um projeto ou a construções como Actions e/ou Controllers pontualmente (se trabalharmos com Web APIs).

Já abordei recentemente a implementação e uso de middlewares no ASP.NET Core em outro artigo neste blog (inclui exemplos + vídeo):

.NET + Design Patterns na prática: middlewares e o padrão Chain of Responsibility

Um exemplo que disponibilizei no meu GitHub também deve ser destacado, no qual foi empregado o atributo MiddlewareFilter em uma Action de um Controller:

.NET 6 + ASP.NET Core + FluentMigrator + SQL Server + SQLite + Fluent Migrator + Class Library + Middleware Indisponibilidade (utilizando o atributo MiddlewareFilter)

Uma resposta a tais questionamentos está em um novo elemento para a configuração de endpoints em Minimal APIs, o qual foi disponibilizado a partir do .NET 7: tratam-se dos Filters, estruturas que permitem a execução de código antes e depois das instruções de processamento de um endpoint.

O exemplo apresentado a seguir é uma variação da implementação do middleware do artigo que mencionei aqui anteriormente, estando também disponível no GitHub:

https://github.com/renatogroffe/ASPNETCore7-MinimalAPIs-Filters-Swagger_ContagemAcessos-ApiKey

Caso achem útil a solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!

Foi implementada nesta aplicação a validação de requisições com base no uso de uma API Key, que deverá ser informada como um Header em tais solicitações. Trata-se de um mecanismo adicional de segurança que pode ser usado em conjunto com funcionalidades oferecidas por um API Gateway, com o intuito de impossibilitar o acesso direto a APIs REST que deveriam estar protegidas.

Para os testes desse artigo preenchi criei uma seção chamada ApiKeyChecking no arquivo appsettings.json, com as configurações Header e Key:

O Header e a API Key serão manipulados através de uma classe chamada ApiKeyCheckingConfigurations:

Chegamos então ao código do arquivo Program.cs:

  • As configurações para validar a API Key foram injetadas em uma instância de ApiKeyCheckingConfigurations, que atuará como um Singleton (linhas 30 a 34);
  • O endpoint representado pela chamada a MapGet (a partir da linha 48) retornará informações de contagem de acesso (um valor incremental), com o Filter sendo implementado por meio de uma chamada ao método AddEndpointFilter (linhas 68 a 94);
  • Em AddEndpointFilter será validada a API Key, destacando-se aqui 3 momentos… Um primeiro que envolve a validação propriamente dita, um segundo momento com uma chamada a await next(context) transferindo a execução para o próximo Filter (ou até mesmo outro middleware na pilha) e que pode chegar ao código do endpoint propriamente dito — linha 84), além de um terceiro instante com a exibição de informações sobre o resultado gerado (linha 85).

Testes com este exemplo podem ser acompanhados na gravação de uma live (disponível no YouTube) que realizei recentemente no Canal .NET:

Na imagem a seguir podemos observar no debugging o primeiro momento mencionado, com a API Key validada:

Clique nesta imagem para visualizar com uma melhor resolução

O segundo instante com a geração da resposta na implementação do endpoint:

Clique nesta imagem para visualizar com uma melhor resolução

E o terceiro momento com a exibição de informações (tipo) da resposta gerada:

Clique nesta imagem para visualizar com uma melhor resolução

Já a próxima imagem mostra a requisição criada via Postman para a execução desses testes, com o resultado que foi retornado à ferramenta:

Um fluxo alternativo seria a ausência da API Key ou um valor inválido para a mesma, como se observa na imagem seguinte:

Clique nesta imagem para visualizar com uma melhor resolução

Resultando assim numa resposta com o status code 401 (Unauthorized):

E finalizo este post com um convite…

Neste novo evento ONLINE e GRATUITO do Canal .NET serão apresentadas as principais novidades que integram o .NET 7, com exemplos de implementação já utilizando o C# 11 e o ASP.NET Core.

Quando: 06/03/2023 (segunda) a partir das 21:00 — horário de Brasília

Faça sua inscrição em:
https://bit.ly/live-dotnet7-novidades

--

--

Renato Groffe
Renato Groffe

Written by Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker