Projeto de estudo para proteger projetos ASP.Net core 6 com KeyCloak e as questões de monitoramento e trancing utilizando Prometheus, Grafana e Jaeguer.
Formado por projetos ASP.Net MVC, API e WorkerService e utiliza Keycloak, RabbitMq e PostgreSQL onde a autenticação dos projetos é feita através KeyCloak, os comandos e eventos são enviados para o RabbitMQ e os dados são gravados no PostgreSQL.
Para o FrontEnd como proxy reverso estou utilizando um NGINX e também existe um projeto angular e para serviços a alternativa a API é um projeto gRPC que até 11/2022 não foi iniciado.
Pré Requisitos
- Instalação do docker e docker-compose
- Instalação do openssl
Criação dos certificados
Executar os comandos a baixo dentro da pasta "src/nginx/certificate" para criar os certificados auto assinados.openssl req -x509 -out mvc.localhost.crt -keyout mvc.localhost.key \ -newkey rsa:2048 -nodes -sha256 -days 1024 \ -subj '/CN=mvc.localhost' -extensions EXT -config <( \ printf "[dn]\nCN=mvc.localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:mvc.localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth") openssl req -x509 -out api.localhost.crt -keyout api.localhost.key \ -newkey rsa:2048 -nodes -sha256 -days 1024 \ -subj '/CN=api.localhost' -extensions EXT -config <( \ printf "[dn]\nCN=api.localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:api.localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth") openssl req -x509 -out angular.localhost.crt -keyout angular.localhost.key \ -newkey rsa:2048 -nodes -sha256 -days 1024 \ -subj '/CN=angular.localhost' -extensions EXT -config <( \ printf "[dn]\nCN=angular.localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:angular.localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth") openssl req -x509 -out keycloak.localhost.crt -keyout keycloak.localhost.key \ -newkey rsa:2048 -nodes -sha256 -days 1024 \ -subj '/CN=keycloak.localhost' -extensions EXT -config <( \ printf "[dn]\nCN=keycloak.localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:keycloak.localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
Instale os certficados na maquina como confiável
Windows
Execute o comando win+R e digite mmc
Arquivo -> Adicionar/remover snap-in
Importar certificado em "Autoridades de certificação raiz confiáveis"
Linux
Copie os certificados para pasta "/usr/local/share/ca-certificates/"
Execute o comando
sudo update-ca-certificates
Execute o comando a baixo na raiz do repositório
docker-compose build docker-compose up -d
Via API do Keycloak e Postman
- Importe no postman a Collection "SetupUserKeycloak.postman_collection.json" que está na pasta raiz do projeto
- Execute as requisições em sequência
- Obter token
- Criar usuário
- Recuperar usuário
- Recuperar grupos
- Adicionar usuário ao grupo
- Cadastrar senha para o usuário
Via Interface do Keycloak
Navegue até a url https://keycloak.localhost
Cadastre um novo usuário associado ao grupo admin
Crie uma Senha para o usuário e desmarque a opção de temporario
MVC
Navege até a url do projeto MVC https://mvc.localhost e clique no menu Privacy
Angular
Navege até a url do projeto Angular **https://angular.localhost** e clique no botão login ![HomeMVC](asset/10%20AngularHome.PNG)Faça o Login com o usuário que foi criado no Keycloak
API
Microsoft.AspNetCore.Authentication.OpenIdConnect
Microsoft.AspNetCore.Authentication.JwtBearer
OpenTelemetry.Exporter.Jaeger
OpenTelemetry.Exporter.Prometheus.AspNetCore
OpenTelemetry.Extensions.Hosting
OpenTelemetry.Instrumentation.AspNetCore
Polly
RabbitMQ.Client
Worker
FluentMigrator
FluentMigrator.Runner
FluentMigrator.Runner.Postgres
Npgsql.Json.NET
OpenTelemetry.Exporter.Jaeger
OpenTelemetry.Exporter.Prometheus.AspNetCore
OpenTelemetry.Extensions.Hosting
OpenTelemetry.Instrumentation.AspNetCore
Polly
RabbitMQ.Client
MVC
Flurl
IdentityModel.AspNetCore
Microsoft.AspNetCore.Authentication.Cookies
Microsoft.AspNetCore.Authentication.OpenIdConnect
Microsoft.Identity.Web
OpenTelemetry.Exporter.Jaeger
OpenTelemetry.Exporter.Prometheus.AspNetCore
OpenTelemetry.Extensions.Hosting
OpenTelemetry.Instrumentation.AspNetCore
Polly
Domain
Microsoft.Extensions.Logging.Abstractions
Data
Dapper
Npgsql
Polly
RabbitMQ.Client
Configurações
IdentityModel.AspNetCore
Microsoft.AspNetCore.Authentication.Cookies
Microsoft.AspNetCore.Authentication.OpenIdConnect
Microsoft.Identity.Web
Microsoft.IdentityModel.Tokens
OpenTelemetry
OpenTelemetry.Exporter.Console
OpenTelemetry.Exporter.Jaeger
OpenTelemetry.Exporter.OpenTelemetryProtocol
OpenTelemetry.Exporter.Prometheus.AspNetCore
OpenTelemetry.Extensions.Hosting
OpenTelemetry.Instrumentation.AspNetCore
OpenTelemetry.Instrumentation.Http
OpenTelemetry.Instrumentation.SqlClient
Polly
Serilog
System.IdentityModel.Tokens.Jwt
Angular
Angular
angular-auth-oidc-client
jwt-decode
bootstrap
sequenceDiagram
autonumber
actor Funcionario
participant MVC
participant API
participant Keycloak
participant RabbitMQ
participant Worker
alt logged
Funcionario->>+MVC: Get Home
MVC-->>+API: Get Wheather
API->>+Keycloak: Is Token Valid?
Keycloak-->>-API: True
API->>RabbitMQ: publish message
Worker->>+RabbitMQ: Get message
Worker->>+RabbitMQ: publish Event
API-->>-MVC: json result
MVC-->>-Funcionario: Html
else not logged
Funcionario->>+MVC: Get Home
MVC-->>-Funcionario: Html
end
sequenceDiagram
autonumber
actor Funcionario
participant MVC
participant API
participant Keycloak
participant RabbitMQ
participant Worker
Funcionario->>+MVC: Login
MVC->>+Keycloak: Redirect
Keycloak-->>-MVC: User Token
MVC-->>-Funcionario: Html with User Token