Перейти к содержимому
ecdsa.com
Microsoft.IdentityModel.Protocols (.NET).NET

Сообщение об ошибке

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

Также выводится как

  • 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:

Дальше сообщение продолжается фразой «Will retry at '…'. Exception: '…'» и текстом внутреннего исключения. URL — это ваш `Authority` + `/.well-known/openid-configuration` или ваш `MetadataAddress`.

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

Что это означает

Диспетчер конфигурации не смог загрузить (или разобрать) документ обнаружения OpenID Connect, поэтому у обработчика JWT Bearer или OpenID Connect нет ни издателя, ни ключей подписи. В результате отклоняется каждый токен, обычно с последующими ошибками IDX10500/IDX10503. Настоящая причина — во внутреннем исключении: IDX20108, если адрес метаданных использует обычный HTTP, а требуется HTTPS, в остальных случаях — IDX20804 с сетевой ошибкой или ошибкой TLS.

Почему это происходит

Как исправить

  1. 1.

    Разрешайте метаданные по HTTP только в среде разработки

    Привяжите `RequireHttpsMetadata = false` к среде разработки; в рабочей среде адрес Authority обязан использовать HTTPS, потому что загружаемые ключи определяют, какие токены вы принимаете.

    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.

    Запросите URL оттуда, где работает API

    Выполните запрос внутри контейнера или пода API. Ответ 200 с JSON подтверждает, что сеть и TLS в порядке; любой другой результат укажет, какой уровень нужно исправлять.

    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

Связанные ошибки

Открыть всю базу ошибок подписей