Ошибка 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"
}