Skip to content

correia97/sso-arquitetura

Repository files navigation

.NET Coverage Quality Gate Status CircleCI codecov

Exemplos de projetos em .NET com algum SSO

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.

Preparação do ambiente

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

Executar

Arquivo -> Adicionar/remover snap-in Adicionar snap-in

Certificados Certificado

Conta de computador Conta de computador

Concluir Concluir

Confirmação Confirmação

Importar certificado em "Autoridades de certificação raiz confiáveis" Importar certificado

Inicio d importação importação

Localizar o certificado Localizar o certificado

Avançar Avançar

Concluir Concluir


Linux

Copie os certificados para pasta "/usr/local/share/ca-certificates/"

Execute o comando

sudo update-ca-certificates



Executando o Projeto

Execute o comando a baixo na raiz do repositório

docker-compose build
docker-compose up -d 

Criar um usuário para aplicação

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 home

Faça login no Keycloak Login

Altere para o realm Sample Realm

Navega até a opção Usuários Usuarios

Cadastre um novo usuário associado ao grupo admin Novousuario Novousuario-grupo

Crie uma Senha para o usuário e desmarque a opção de temporario Senhausuario


Usando a aplicação

MVC

Navege até a url do projeto MVC https://mvc.localhost e clique no menu Privacy HomeMVC

Faça o Login com o usuário que foi criado no Keycloak LoginUsuario

Navegue na aplicação autenticada HomeAutenticada


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 LoginUsuario

Navegue na aplicação autenticada HomeAutenticada

Home consumindo a API HomeAutenticada



Dependências principais

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

Fluxo de Dados

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
	

Fluxo de login

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

	


Referências

Keycloak
Exemplo Auth0 API
Exemplo Auth0 MVC