Olá pessoas, tudo bem?

Depois de um hiato de algumas semanas (a vida está bastante corrida), vamos finalizar a nossa série de posts adicionando autenticação a nossa aplicação ASP.NET Core. O modelo de autenticação que iremos utilizar é um dos mais utilizados hoje para autenticação de apis, o bearer token (JWT).

Dependências

Como nos demais posts, iremos começar com as dependências. Para adicionarmos a autenticação em nossa aplicação, devemos modificar o nosso arquivo project.json incluindo o seguinte:

  • Microsoft.AspNetCore.Authentication.JwtBearer: Esta dependência irá habilitar a autenticação usando o JWT.

Captura de tela de 2016-08-09 22-42-21

EntityFramework

Para este exemplo, criaremos uma nova entidade no nosso contexto EFContext para armazenar as informações do usuário.

Captura de tela de 2016-08-09 23-09-43

Captura de tela de 2016-08-09 23-10-00

Middleware de autenticação

Para habilitarmos a autenticação em nossa WebAPI, devemos adicioná-la ao pipeline do ASP.NET usando o extension method  UseJwtBearerAuthentication na classe Startup.cs. 

No método ConfigureServices , adicionamos ao container de DI um objeto do tipo JwtSettings que irá armazenar as informações para configuração do nosso token,para que possamos ter acesso em diversas partes do sistema.

Iremos utilizar estas informações já no método Configure , nas opções da inicialização do middleware (entrarei em detalhes do handler existente nas opções mais adiante).

Captura de tela de 2016-08-09 23-22-51

 

Captura de tela de 2016-08-09 23-02-12

Outro detalhe importante, é a inclusão das configurações do token no arquivo appsettings.json (para este exemplo, pois a recomendação é armazenar em um local mais seguro, como o DataProtection, por exemplo).

Captura de tela de 2016-08-09 23-04-22

Criação da Conta e Login

O próximo passo, é criarmos um controller chamado AccountsController para tratar a criação da conta e o login do usuário. Esta última irá criar um token e devolvê-lo ao cliente.

Captura de tela de 2016-08-09 23-12-34

 

Na criação da conta, método CreateAccount , apenas verificamos se o usuário já existe, e em caso negativo criamos o mesmo.

Na autenticação do usuário, método Login , utilizamos o JwtProvider (descrito abaixo) para criar o token após a validação do usuário.

Captura de tela de 2016-08-09 23-19-49

O JwtProvider foi criado para encapsular a criação do token, utilizando as settings e o tokenHandler do próprio framework para criar o token JWT, ambos adicionados a coleção de serviços no Startup.

Proteção da API

Para protegermos a nossa API, basta adicionarmos o atribute Authorize aos nossos controllers/actions.

Captura de tela de 2016-08-09 23-34-38

A partir de agora, sempre que precisarmos consultar uma ordem devemos enviar o cabeçalho http Authorization  com o valor Bearer [token] retornado no login do usuário.

Captura de tela de 2016-08-09 23-38-14

AuthorizationHandler (JwtBearerEvents)

Sempre que criamos um token damos um período de validade para ele, certo? E o usuário poderá acessar o sistema dentro deste período.

Mas o que acontece se a nossa aplicação tiver um controle de acesso (autorização) por horário, por exemplo? Ou ainda se o usuário foi bloqueado por algum motivo específico? Ou qualquer outra alteração a nível de autorização que bloqueie o acesso do usuário? Poderíamos tratar isto a nível de controller, ou talvez adicionando/modificando um filter do pipeline do ASP.NET.

Para estes casos, podemos utilizar uma ferramenta mais simples. Lembram do handler adicionado as opções de inicialização do middleware de autorização na classe Startup? Ele foi construído sobre um componente do ASP chamado JwtBearerEvents, e permite que tenhamos controle sobre algumas etapas do processamento do token.

Captura de tela de 2016-08-09 23-48-58

Neste exemplo utilizamos o método TokenValidated , que é chamado sempre que o token for processado com sucesso. Aqui estamos apenas verificando se o usuário existe e, em caso negativo, alteramos a StatusCode  da resposta para 401 e pulamos para a próxima etapa do pipeline do ASP.NET. Desta forma, sempre que um token válido cair no sistema ele irá efetuar essa verificação.

Testes

Para testar estas atualizações utilizando o Docker, basta seguir os passos do post anterior.

 

Era isso pessoal! Se alguém tiver alguma dica de implementação ou quiser discutir algum detalhe sobre a minha, será muito bem vindo!

O projeto está no GitHub.

Um grande abraço, e até a próxima!