Pular para o conteúdo
ecdsa.com
Microsoft.IdentityModel.Protocols (.NET).NET

Mensagem de erro

IDX20803: Unable to obtain configuration from: 'http://keycloak:8080/realms/main/.well-known/openid-configuration'.

Também aparece como

  • System.InvalidOperationException: IDX20803: Unable to obtain configuration from:
  • IDX20108: The address specified 'http://keycloak:8080/realms/main/.well-known/openid-configuration' is not valid as per HTTPS scheme. Please specify an https address for security reasons.
  • IDX20804: Unable to retrieve document from:

A mensagem continua com “Will retry at '…'. Exception: '…'” e o texto da exceção interna. A URL é o seu `Authority` + `/.well-known/openid-configuration` ou o seu `MetadataAddress`.

Microsoft.IdentityModel.Protocols (.NET) — ConfigurationManager<OpenIdConnectConfiguration>, used by JwtBearer and OpenIdConnect handlers

O que significa

O gerenciador de configuração não conseguiu baixar (ou interpretar) o documento de descoberta do OpenID Connect, então o handler JWT Bearer ou OpenID Connect fica sem emissor e sem chaves de assinatura. A partir daí, todo token é rejeitado, normalmente com erros IDX10500/IDX10503 em seguida. O motivo real está na exceção interna: IDX20108 quando o endereço de metadados é HTTP não criptografado e HTTPS é exigido; nos demais casos, IDX20804 com um erro de rede ou de TLS.

Por que acontece

Como corrigir

  1. 1.

    Permitir metadados HTTP apenas em desenvolvimento

    Vincule `RequireHttpsMetadata = false` ao ambiente de desenvolvimento; em produção, a autoridade deve usar HTTPS, porque as chaves que você baixa decidem quais tokens você aceita.

    csharp
    builder.Services.AddAuthentication().AddJwtBearer(options =>
    {
        options.Authority = builder.Configuration["Auth:Authority"];
        // Plain HTTP only for local development containers; production authorities must be HTTPS.
        options.RequireHttpsMetadata = !builder.Environment.IsDevelopment();
    });
  2. 2.

    Buscar a URL a partir de onde a API roda

    Faça a requisição de dentro do contêiner ou pod da API. Um 200 com JSON confirma a rede e o TLS; qualquer outra resposta indica a camada que precisa ser corrigida.

    bash
    # From inside the API container: DNS, TLS and HTTP status of the metadata URL
    curl -sS -o /dev/null -w '%{http_code} %{ssl_verify_result}\n' https://login.example.com/realms/main/.well-known/openid-configuration

Erros relacionados

Ver toda a base de erros de assinatura