Ошибка Duende IdentityServer: использование 2 эмитентов и недопустимая проблема с токеном

Проблема начинается с того, что в моих журналах появляется много таких ошибок:

       {
    "@mt": "Your license for Duende IdentityServer only permits {issuerLimit} number of issuers.
            You have processed requests for {issuerCount}. The issuers used were: {issuers}.",
    "@l": "Error",
    "issuerLimit": 1,
    "issuerCount": 2,
    "issuers": [
      "https://www.example.org",
      "https://example.org"
    ],
    "SourceContext": "Duende.IdentityServer",
    "RequestPath": "/connect/checksession"
  },

Я использую шаблон MS по умолчанию для размещенной Blazor WebAssembly с отдельными учетными записями. Я не указал эмитента явно, потому что у меня есть test.mydomain.org, и это показалось удобным.

у меня есть DNS CNAME www.example.org на example.org, а в IIS у меня есть один сайт example.org с 4 привязками: http и https для версий с www и без www.

Когда все работает нормально, как бы я ни пытался открыть свой сайт, используя версию с www или без www, в режиме инкогнито, вошел в систему или вышел из системы, независимо от того, что я пытаюсь, я не могу намеренно получить эту ошибку в журнале.

Но затем он начинает появляться, и его замечает пользователь, который может нормально войти в систему, но при попытке получить доступ к любой конечной точке API, требующей авторизации, возвращается Bearer error="invalid_token", error_description="The issuer 'https://example.com' is invalid"( Как отлаживать только случайную ошибку носителя = "invalid_token").

Интересно, как вообще возможно получить запрос от www.mydomain.org к IdentityServer, если я не могу сделать это вручную, запросив версию с www? Откуда IdentityServer получает эти эмитенты? И через какое-то время сервер идентификации начинает выдавать эту ошибку намеренно?

1 ответ

По умолчанию IssuerURI основан на хосте, на котором получен запрос. Например,https://www.example.org/.well-known/openid-configurationпокажет эмитента какhttps://www.example.orgпокаhttps://example.org/.well-known/openid-configurationпокажет эмитента какhttps://example.org. Если оба имени хоста подходят для вашего idp, то, скорее всего, это связано с настройкой.

Опция 1

Самый простой способ — синхронизировать свои права входа в систему с тем, что ожидают API. Одно из ваших приложений использует полномочия с префиксом и, вероятно, использует токены доступа для обращения к другим службам, которые ожидают, что полномочия не будут содержать .

Вариант 2

Вы можете обновить все свои API, чтобы они принимали список эмитентов, а не один. Это поддержало бы обоихwwwи без затрат на дополнительную настройку на каждом уровне.

      var issuers = new List<string>()
    {
       "https://www.example.org",
      "https://example.org"
    };
// ...
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
{
    // ...

    ValidateIssuer = true,
    ValidIssuers = issuers

    // ...
};

Вариант 3

Вы можете обновить конфигурацию, чтобы сделать эмитент статическим независимо от хоста, используемого для входа в систему. Преимущество этого варианта заключается в том, что вы не получите ошибок лицензии в IdentityServer из-за наличия двух эмитентов, и вам не нужно будет менять кучу настроек в подключенных API. https://docs.duendesoftware.com/identityserver/v6/reference/options/

      "IdentityServerOptions": {
   "IssuerUri": "https://www.example.org"
}
Другие вопросы по тегам