Desenvolvimento .NET

.NET

Autenticação e autorização JWT em uma API .NET 6.0

Autenticação e autorização JWT em uma API .NET 6.0

Introdução

Autenticação e Autorização são processos de segurança importantes utilizados para proteger uma aplicação, neste artigo vamos criar uma Web Api implementando a autenticação JWT.

Você pode acessar o repositório desse projeto em example-dotnet-identity

Pré-requisitos

  • .NET 6
  • Visual Studio Code (VS Code)
  • SQl Server Express 2019 (LocalDB) Microsoft Docs

Criando o projeto

Com o comando dotnet new webapi vamos criar um projeto do tipo Api, podemos utilizar o parâmetro -o para criar o projeto dentro de uma pasta.

dotnet new webapi -o example-dotnet-identity

Instalando os pacotes necessários

Precisamos instalar os seguintes pacotes no projeto:

  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.AspNetCore.Identity.EntityFrameworkCore
  • Microsoft.AspNetCore.Authentication.JwtBearer

Dotnet CLI

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

Appsettings

Precisamos de algumas configurações como conexão de banco de dados e detalhes para autenticação JWT essas configurações estão no arquivo appsettings.json.

Data

Vamos criar uma pasta Data com um arquivo ApplicationContext.cs onde herdamos de IdentityDbContext todas as funcionalidades necessárias para controle de tabelas que o ASP.NET Core Identity gera.

Auth

Vamos criar uma pasta Auth com um arquivo UserRoles.cs essa classe estática será responsável para representar as possíveis roles do sistema, você pode criar as roles de acordo com a necessidade do seu projeto.

Models

Vamos criar uma pasta Models com os modelos para criar um usuário, fazer login, retornar um token e uma modelo padrão para resposta da api.

CreateUserModel.cs

LoginModel.cs

TokenModel.cs

ResponseModel.cs

Controllers

Agora vamos criar um controller AuthenticateController.cs para expor os endpoints para que o usuário possa se autenticar. E o controller HomeController.cs para testar os acessos.

AuthenticateController.cs

HomeController.cs

Program

Precisamos adicionar na classe Program.cs algumas configurações como AddDbContext, AddIdentity, AddAuthentication, AddJwtBearer, UseAuthentication e UseAuthorization.

Migration

Com o comando dotnet ef add migration Initial vamos criar a estrutura inicial no banco de dados.

dotnet ef migrations add Initial

Logo após podemos utilizar o comando dotnet ef database update para aplicar a migração.

dotnet ef database update

Teremos a seguinte estrutura no banco de dados:

Banco de dados Sql migration Identity
Banco de dados Sql migration Identity

Caso tenha alguma duvida sobre o processo de migrations do ef core confira o seguinte artigo migrations entity framework core.

Executando o projeto

Agora vamos utilizar o comando dotnet run para executar o projeto, e acessar a rota /swagger para visualizar os endpoints disponíveis em nossa API.

Execução do projeto Web Api Swagger
Execução do projeto Web Api Swagger

Vamos utilizar o endpoint /api/Authenticate/register para criar dois usuários:

user:

{
  "userName": "user",
  "isAdmin": false,
  "email": "[email protected]",
  "password": "Password@123"
}

admin:

{
  "userName": "admin",
  "isAdmin": true,
  "email": "[email protected]",
  "password": "Password@123"
}

Para obter o token vamos utilizar o endpoint /api/Authenticate/register informando username e password como resultado vamos obter o token.

Obtendo token jwt api dotnet
Obtendo token jwt api dotnet

Precisamos informar o token obtido clicando no botão Authorize.

Botão de Authorize swagger
Botão de Authorize swagger
Modal de Autorização swagger
Modal de Autorização swagger

Testando Autorização e roles

Nos controllers Home utilizamos a marcação [Authorize] para proteger um endpoint, e [Authorize(Roles = UserRoles.User)] para proteger um endpoint com acesso restrito apenas usuários que possuem a role específica.

Rotas protegidas com Autorização swagger
Rotas protegidas com Autorização swagger

/api/Home/anonymous Qualquer um pode acessar, login não obrigatório.

/api/Home/authenticated Qualquer usuário do sistema pode acessar, login obrigatório.

/api/Home/user Apenas usuário do sistema com a role user podem acessar, login obrigatório.

/api/Home/admin Apenas usuário do sistema com a role admin podem acessar, login obrigatório.

Ao tentar acessar um endpoint em que o login é obrigatório vamos receber o erro HTTP Unauthorized (401).

Retorno HTTP Unauthorized (401)
Retorno HTTP Unauthorized (401)

Ao tentar acessar um endpoint que o usuário não possui a role específica vamos receber o erro HTTP Forbidden (403).

Retorno HTTP Forbidden (403)
Retorno HTTP Forbidden (403)

Conclusão

O ASP.NET Core Identity permite adicionar a funcionalidade de login em um projeto, permitindo que os usuários de um sistema possam criar uma conta e fazer login simples como o exemplo demonstrado neste artigo ou até mesmo utilizar um provedor externo como Facebook, Google, Microsoft... Para mais informações sobre segurança do ASP.NET Core consulte a Documentação oficial.

Artigos Recomendados

5 Comments

    1. É possível sim!
      – Você precisa usar o pacote Microsoft.EntityFrameworkCore.Sqlite
      dotnet add package Microsoft.EntityFrameworkCore.Sqlite

      – Alterar UseSqlServer para UseSqlite na linha 14 da classe Program.cs

      De: options.UseSqlServer(builder.Configuration.GetConnectionString(“DefaultConnection”));

      para: options.UseSqlite(builder.Configuration.GetConnectionString(“DefaultConnection”));

      – Altere a ConnectionString no appsettings.json
      “DefaultConnection”: “Data Source=ExampleJWTAuth.db”

  1. Boa tarde!
    Essas informações que estão no appsettings são padrão? Eu adiciono elas manualmente ou pego de algum lugar?

    Desde já obrigado e parabéns pelo artigo!

    1. Fala Junior!

      O appsettings já vem com algumas chaves, por exemplo “Logging” e “AllowedHosts”, as outras chaves podemos criar de acordo com o projeto.

      “ConnectionStrings” você vai montar as informações de acordo com seu banco de dados.

      “JWT” são configurações que escolhi para o JWT da aplicação, mas você pode utilizar outras configurações de acordo com seu projeto.

      Exemplo:
      O “Secret” eu combinei a palavra JWTAuthenticationSecured + Guid (gerado de forma aleatória ). Mas poderia ser outro valor.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *