API para autenticação e autorização baseada em JWT com ASP.NET Core Identity (roles), persistência em SQLite e observabilidade com Serilog. O projeto inclui testes unitários e de integração com xUnit e WebApplicationFactory.
- Autenticação por
JWT Bearercom claims padrão e expiração configurável. - Autorização baseada em roles (
User,Admin) viaAuthorizeAttribute. - Persistência com EF Core (SQLite) e schema do Identity pré-migrado.
- Logs em console e arquivo com Serilog (rotação diária).
- Testes: unitários para geração de token e integração cobrindo fluxo de registro, login, autorização e endpoints protegidos.
ASP.NET Core 9(Minimal Hosting Model).Entity Framework Core+ASP.NET Core Identity.JWT(System.IdentityModel.Tokens.Jwt).SQLite(arquivousers.db).Serilog(console e arquivo).xUnit+Microsoft.AspNetCore.Mvc.Testingpara integração.
DOTNET SDK9.0+- Windows/macOS/Linux com acesso a filesystem (SQLite embarcado).
Controllers/ Endpoints de Auth e Users
Data/ DbContext (Identity)
Migrations/ Migrações EF Core (SQLite)
Models/ DTOs de entrada
Services/ Serviços (JwtTokenService)
Properties/ launchSettings.json
Program.cs Bootstrap da aplicação
appsettings.json Configuração padrão
UsersApi.Tests/ Testes unitários e integração
logs/ Arquivos de log
users.db Banco SQLite (dev)
ProfessionalPortfolio.sln Solution
UsersApi.csproj Projeto da API
- Edite
appsettings.json:ConnectionStrings:DefaultConnection:Data Source=users.db(padrão).Jwt:Key: defina uma chave longa e aleatória (mín. 32 bytes).Jwt:IssuereJwt:Audience: identidades do emissor e público.
- Variáveis de ambiente (opcional) para seed de admin:
ADMIN_USER(ex.:admin)ADMIN_PASS(ex.:Adm1n!234)
dotnet run --project .\UsersApi.csproj- OpenAPI JSON:
GET /openapi/v1.json. - Logs:
logs/log-<data>.txt.
POST /api/auth/register— registra usuário.- Exemplo:
curl -X POST http://localhost:5000/api/auth/register \ -H "Content-Type: application/json" \ -d '{"username":"alice","password":"Pass!234","email":"alice@exemplo.com","role":"User"}'
- Exemplo:
POST /api/auth/login— retorna{ token }.- Exemplo:
curl -X POST http://localhost:5000/api/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"alice","password":"Pass!234"}'
- Exemplo:
POST /api/auth/assign-role?username={u}&role={r}— requerAdmin.GET /api/users/me— requer autenticação.GET /api/users/admin-only— requer roleAdmin.
- Inclua o token no header:
Authorization: Bearer {token}
- Migrações já incluídas (SQLite). Para criar/atualizar:
dotnet ef migrations add <Nome> -p .\UsersApi.csproj -s .\UsersApi.csproj
dotnet ef database update -p .\UsersApi.csproj -s .\UsersApi.csproj- Executa unitários e integração:
dotnet test ProfessionalPortfolio.sln -c Debug- Integração usa
WebApplicationFactory<Program>com SQLite em memória. - Se houver erros de referência do xUnit, rode
dotnet restoreedotnet cleanantes de testar.
- Serilog escreve em console e arquivo:
logs/log-.txtcom rotação diária.
- Ajuste nível em
Serilog.MinimumLevelnoappsettings.json.
- Mantenha
Jwt:Keyfora do VCS (use secrets/variáveis de ambiente). - Prefira HTTPS em produção.
- Considere adicionar: expiração curta, refresh tokens, rate limiting e 2FA.
- Swagger UI completo.
- Refresh tokens, rate limit, 2FA.
- Políticas de autorização granulares e auditoria de ações.
- Abra issues com contexto e passos para reproduzir.
- Submeta PRs com descrição clara e testes cobrindo mudanças.