Fala, pessoal! Durante a Aula "04. Autenticação e Autorização" (Azure Entra ID) Atividade "12 Testando o fluxo de autenticação", enfrentei um erro de conexão bloqueada ao tentar fazer o login da Microsoft acessando https://localhost:5001/Medicos. Depois de muitos testes, documentei aqui o problema e a solução completa para caso alguém passe pela mesma situação.
O Problema / Erro Principal
Ao tentar autenticar o projeto no Entra ID, a aplicação quebrava com uma série de exceções de Sockets e SSL, culminando neste erro:
SocketException: Uma conexão estabelecida foi anulada pelo software no computador host.
HttpRequestException: The SSL connection could not be established, see inner exception.
IOException: IDX20804: Unable to retrieve document from: 'https://login.microsoftonline.com/d3a8b901.../.well-known/openid-configuration'.
Por que isso acontece?
Alguns antivírus (como o Kaspersky, FortiClient, etc.) interceptam o tráfego de rede para escanear conexões HTTPS. Ao fazer isso, eles trocam o certificado SSL original da Microsoft pelo certificado do próprio antivírus. O .NET percebe essa "invasão", considera a conexão insegura e derruba a requisição.
Tentativas que NÃO funcionaram
Antes de chegar à solução real, tentei várias coisas (que não resolveram):
- Acessar a URL do erro pelo navegador (funcionava normalmente, o problema era só no .NET).
- Adicionar o
dotnet.exee oVollMed.Web.execomo aplicativos confiáveis no Kaspersky. - Desmarcar "Injetar JS no tráfego da Web" e "Não verificar conexões criptografadas" na rede do antivírus.
- Desativar o antivírus completamente (pasmem, às vezes o serviço de rede deles continua rodando em segundo plano).
- Alterar versões de HTTP/TLS no código e tentar forçar o bypass de erros SSL no
HttpClient.
A Solução Definitiva (Isolamento com Docker)
Para fugir do bloqueio de rede do host (Windows + Antivírus), a melhor arquitetura é rodar os projetos isolados usando Docker e Docker Compose, fazendo eles conversarem por uma rede interna.
Passo 1: Criar o Docker Compose
Adicione o suporte a orquestrador de contêineres na Solution para criar o arquivo docker-compose.yaml conectando o Front e o Back:
version: '3.4'
services:
vollmed.web:
image: ${DOCKER_REGISTRY-}vollmedweb
build:
context: .
dockerfile: VollMed.Web/Dockerfile
ports:
- "5000:5000" # Porta HTTP
- "5001:5001" # Porta HTTPS (Usada no Portal do Azure)
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:5001;http://+:5000
vollmed.webapi:
image: ${DOCKER_REGISTRY-}vollmedwebapi
build:
context: .
dockerfile: VollMed.WebApi/Dockerfile
ports:
- "6000:6000"
- "6001:6001"
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:6001;http://+:6000
Passo 2: Ajustar o launchSettings.json
Em ambos os projetos (Web e WebApi), configure o perfil do Docker para mapear as portas corretamente e impedir portas aleatórias. Exemplo do projeto Web:
"Container (Dockerfile)": {
"commandName": "Docker",
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
"environmentVariables": {
"ASPNETCORE_URLS": "https://+:5001;http://+:5000"
},
"httpPort": 5000,
"sslPort": 5001,
"publishAllPorts": false,
"useSSL": true
}
Passo 3: Arrumar a comunicação interna (O Pulo do Gato)
Como o front e o back estão em contêineres Docker isolados, o projeto Web não pode mais chamar localhost. Ele deve usar a porta HTTP interna e o host do Docker.
No appsettings.Development.json do VollMed.Web, altere a BaseUrl:
{
"VollMed_WebApi": {
// Usa host especial do Docker e a porta HTTP (6000) para evitar conflitos de SSL internamente
"BaseAddress": "http://host.docker.internal:6000"
}
}
(Nota: O Entra ID no Portal do Azure não precisa saber disso. Para o Azure, a URL que importa é a do seu navegador, que continuará sendo https://localhost:5001).
Passo 4: Desativar Redirecionamento HTTPS na API
Como o Front agora chama a API via HTTP (6000), a API não pode forçar o redirecionamento para HTTPS, senão teremos erro de SSL entre os contêineres.
Vá no Program.cs do VollMed.WebApi e altere o redirecionamento para rodar apenas fora de desenvolvimento:
// Substitua o 'app.UseHttpsRedirection();' por isso:
if (!app.Environment.IsDevelopment())
{
app.UseHttpsRedirection();
}
Pronto! Agora basta rodar o projeto selecionando o perfil docker-compose. O bloqueio do antivírus não afetará a aplicação rodando dentro do Linux/Docker, a autenticação com o Azure passará a funcionar e os projetos se comunicarão perfeitamente.
Espero que essa documentação economize o tempo de alguém! Bons estudos!