Novidades do .NET 7: Filters no tratamento de requisições em Minimal APIs
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:
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:
O segundo instante com a geração da resposta na implementação do endpoint:
E o terceiro momento com a exibição de informações (tipo) da resposta gerada:
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:
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