ASP.NET Core - JWT Bearer Token - Azure Key Vault

Sem perder o foco na questão da segurança, além do IdentityServer4 que falei na série que começa na parte 1, podemos gerar um token no formato JWT (Json Web Token) e autorização Bearer de forma mais simples.

API

Para começar eu criei uma API (ASP.NET Core 3.1), ela que vai realizar o trabalho de gerar o token de autorização.

Azure App Registration

Para que possamos acessar o Azure, precisamos cadastrar a nossa aplicação cliente (API), este termo "aplicação cliente" eu falei bastante na parte 7 da série sobre o IdentityServer4 e o princípio é exatamente o mesmo, ao registrar uma aplicação cliente no Azure será fornecido o ClientId e o ClientSecret. O ClientSecret aparecerá somente no momento do cadastro, então copie ele, pois não estará mais disponível se você mudar de tela e precisaremos das duas informações mais adiante.
A imagem a seguir mostra nossa aplicação configurada.

Azure App Registration

Para cadastrar basta clicar em "New registration" e preencher os campos.

Azure Key Vault

O Azure Key Vault é uma ferramenta de armazenamento e acesso seguro à chaves, certificados, senhas, entre outros. Você pode obter maiores detalhes aqui.

Criei um Key Vault no Azure e dentro dele cadastrei uma Secret conforme exibido na imagem abaixo com o nome "JwtSecurityKey", para cadastrar use o botão "Generate/Import" e preencha os campos.

Azure Key Vault Configuration

No menu "Overview" do Key Vault cadastrado tem uma URL (DNS Name) que precisaremos mais adiante também.

Program.cs

Quando a aplicação inicia, usamos o DNS Name, ClientId e ClientSecret para buscar as Secrets cadastradas e já permitindo que seja possível acessá-las através do
IConfiguration, esta interface permite que chaves e valores sejam lidos de várias fontes, uma delas sendo o Azure Key Vault, mais informações aqui.

appsettings.json

Exemplo de configuração do arquivo, de onde os dados serão lidos.

Extension Method - Authentication

Eu criei também um método de extensão para configurar o serviço de autenticação. Este método de extensão ajuda a manter o código mais clean e esta classe foi criada em uma class library Infrastructure.Extensions.Security conforme o código a seguir.

O método de extensão deve ser chamado no Startup.cs.

services.AddJwtAuthentication(Configuration);

A configuração que eu gostaria de destacar é a do método AddJwtBearer, pois é ele que vai validar toda requisição que entrar na chamada dos métodos da API onde o ponto mais importante é a secret que vem diretamente do Azure Key Vault.

PostConfigure

Dentro do método de extensão, usei o PostConfigure onde após ter registrado a classe BearerSecurityKey podemos atribuir o valor a uma propriedade da classe concreta à posteriori. Neste caso estou atribuindo o valor vindo lá no Azure Key Vault para facilitar o acesso à informação na injeção de dependência.

Token

A geração do token utiliza a chave que cadastramos no Azure Key Vault.
Eu criei a classe TokenService onde o método Generate realiza toda a configuração para geração do token. É importante lembrar aqui que o valor da secret para geração do token possui alguns pré-requisitos e um deles tem relação com a quantidade de caracteres, onde o mínimo é 32.
Aqui nós pegamos a secret que veio lá do Azure Key Vault através da injeção de dependências.

Get Token

Lá na controller eu chamo a action que recebe algumas informações de usuário e senha através de um post, realiza algumas validações e retorna o token conforme exemplificado na imagem a seguir. Sugiro que você dê uma olhada no projeto do Github.

Get Token Azure Key Vault

Monitoring

Através do Azure você ainda pode monitorar as solicitações das secrets, verificar latência, falhas e assim por diante. Abaixo uma imagem de exemplo.

Azure Key Vault Monitoring

The Twelve-Factor App

Antes de finalizar, eu gostaria de falar sobre este termo, já que o assunto "microsserviços" está tão em foco.
Você já deve ter ouvido falar também em Solution Architect, Software Architect, Enterprise Applications e por aí vai.
Grandes corporações com equipes trabalhando em squad, ou equipes muito grandes fazem com que as empresas passem a adotar medidas de segurança relacionadas às informações fornecidas aos desenvolvedores, então temos visto cada vez menos, aplicações que possuem informações no arquivo appsettings.json, estas estão indo parar nas environment variables onde o desenvolvedor nem sempre possui permissão para acessá-las. Eu comentei mais acima que o IConfiguration pode ler informações de várias fontes e uma delas é a variável de ambiente, sendo assim, cada vez menos aplicações de grandes corporações disponibilizam dados sensíveis ao desenvolvedor, e o Twelve-Factor App fala justamente isso, essa boa prática.
Não é somente isto, estou falando de segurança, mas há outras vantagens e você podem conferir mais informações aqui.

Github

Você pode conferir tudo isso no Github.
Baixe o projeto completo caso tenha dúvidas.

Considerações

Se você baixou o projeto do Github, deve ter percebido que ele tem bem mais coisas do que eu comentei aqui, inclusive a parte de como registrar e consultar as chaves do Azure Key Vault sem precisar usar a interface do Azure, mas é papo para outro momento.