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:
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.
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.
Precisamos informar o token obtido clicando no botão Authorize
.
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.
/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).
Ao tentar acessar um endpoint que o usuário não possui a role específica vamos receber o erro 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.
É possível fazer o jwt usando o SQLite? Como ficaria o connection string nesse caso?
Muito obrigado
É 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”
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!
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.
Muito brabo, parabéns!!