.NET

1 fev, 2018

Exemplo de implementação de políticas customizadas no Asp.Net Core 2.0

Publicidade

Um dos grandes desafios existentes ao desenvolvermos qualquer sistema, independente de sua complexidade, é a implementação de forma satisfatória de todos os aspectos de segurança exigidos de forma implícita e explícita nos requisitos do sistema, atendendo de forma plena as políticas de cada empresa ou organização, e suas regras de negócio.

As organizações variam em níveis hierárquicos, papéis, funções e políticas internas e, por conta disto, é extremamente difícil desenvolver e pensar em uma solução “genérica” que atenda a todas as situações, pois cada sistema possui suas peculiaridades.

A maioria dos sistemas que desenvolvemos no dia a dia extrapola em complexidade a estrutura básica de acessos por perfis ou simples papéis, não sendo às vezes o suficiente para atribuir os privilégios de acesso a todos os módulos e funcionalidades do sistema. E é devido a esta dificuldade que existe a possibilidade de implementar políticas customizadas no Asp.Net Core 2.0.

Eu, particularmente, achei este recurso sensacional, tornando a implementação das regras de acesso menos “invasivas” e mais “elegantes”, além de extremamente flexíveis.

Mas, antes de irmos para o código-fonte, vamos propor aqui um cenário ou estudo de caso.

Cenário/Estudo de Caso

Suponhamos que estejamos desenvolvendo um sistema de reserva de hotéis, e que o mesmo possua as funcionalidades padrão de um site deste tipo como realizar: reserva, cancelamento e avaliações. Mas, à medida que os usuários vão realizando as reservas no site, postando avaliações e fazendo outras ações, o usuário vai ganhando pontuações (score) e caso ele chegue, hipoteticamente, a um determinado valor neste score, determinadas funções no site devem ser liberadas ou permitidas, considerando apenas a pontuação do usuário.

Tal funcionalidade ou ação poderia ser, por exemplo, a possibilidade de cancelar uma reserva em período inferior a 24 horas para clientes que possuem score igual ou superior a 5000 pontos. Como poderíamos implementar este tipo de autorização de forma a usufruir dos recursos de autenticação e autorização que o Asp.Net Core 2.0 nos proporciona?

Lembro aqui que a forma de implementação e solução deste problema proposto neste artigo representa apenas uma opinião pessoal minha e uma sugestão baseado no que venho estudando, podendo haver logicamente formas mais recomendáveis ou até mesmo mais elegantes de se realizar a mesma coisa ou operação, mas de forma diferente para este cenário específico. Mas, vamos para a implementação?

Implementação

Antes de mais nada, todo o código-fonte deste exemplo encontra-se no Github no link abaixo:

Tomando como base o nosso cenário proposto, em que é necessário permitir determinado tipo de cancelamento de reservas para usuários que possuam mais de 5.000 pontos, foi necessário incluir uma referência à política que foi criada de forma customizada na funcionalidade correspondente em forma de anotação, na linha 11:

A seguir, foi necessária clicar uma implementação da interface IAuthorizationRequirement que conteria o tipo de requisito que seria verificado em relação à autorização. No nosso caso é a pontuação do usuário:

Após isto, é necessário criar o Handler em si referente à autorização customizada. Para fins de praticidade deste exemplo, foi atribuído manualmente a pontuação do usuário logado com o valor de 5.100. Mas, neste método, em uma aplicação real, devem ser verificadas questões de identidade, buscar em uma base de dados a pontuação do usuário e outras implementações:

Por fim, devemos “registrar” nossa política na inicialização da aplicação em Startup.cs, conforme pode ser visto nas linhas 9 a 13:

É neste momento que determinamos o valor que desejamos que seja adotado na política de pontuação. Neste caso, atribuímos na inicialização da aplicação que o valor mínimo satisfatório seria 5.000 pontos.

Na aplicação, como no nosso exemplo o usuário possui uma pontuação de 5.100, o acesso à funcionalidade específica de cancelamento é liberada:

Conclusão

Em meio à dificuldade de implementar recursos de segurança em aplicações .NET em meio à requisitos empresariais que sempre vão muito além de mera separação por perfis e papéis, achei este recurso particularmente muito interessante.

Como estamos todos sempre em fase de constante aprendizado, sugestões de melhoria no artigo ou contribuições são sempre muito bem-vindos.

Obrigado por ter lido este artigo até o final.

Referências