Сообщение об ошибке
IDX10205: Issuer validation failed. Issuer: 'https://sts.windows.net/
Также выводится как
- IDX10205: Issuer validation failed.
- Bearer error="invalid_token", error_description="The issuer 'https://sts.windows.net/00000000-0000-0000-0000-000000000000/' is invalid"
Дальше текст продолжается так: «Did not match: validationParameters.ValidIssuer: '…' or validationParameters.ValidIssuers: '…' or validationParameters.ConfigurationManager.CurrentConfiguration.Issuer: '…'». ASP.NET Core отправляет `error_description="The issuer '…' is invalid"`.
Microsoft.IdentityModel.Tokens (.NET) — SecurityTokenInvalidIssuerException
Что это означает
Значение `iss` в токене не совпадает ни с `ValidIssuer`, ни с одним из элементов `ValidIssuers`, ни с издателем из загруженной конфигурации OpenID. Сообщение выводит издателя токена и все значения, с которыми его сравнивали. В Microsoft Entra ID хрестоматийный случай — токен v1.0 (`https://sts.windows.net/<tenant>/`), который проверяют по издателю v2.0 (`https://login.microsoftonline.com/<tenant>/v2.0`), или наоборот.
Почему это происходит
Токен Entra ID v1.0, издатель v2.0 (или наоборот)
частоВерсию токена определяет регистрация приложения API (`requestedAccessTokenVersion`), а не эндпоинт, к которому обратился клиент. API, который ожидает v2.0, получает токены v1.0, пока в манифесте не указано иное.
Токен из другого тенанта
частоМультитенантные приложения получают токены, в издателе которых указан идентификатор тенанта пользователя. Единственный `ValidIssuer` принимает только один тенант; мультитенантным API нужен валидатор издателя, который сверяет тенант со списком разрешённых.
Расхождение в написании
иногдаСтроки сравниваются точно: косая черта в конце, имя хоста в верхнем регистре, суффикс `/v2.0`, путь политики B2C. Скопируйте значение из документа обнаружения.
Как исправить
- 1.
Исправьте версию токена у источника
Если задать `requestedAccessTokenVersion` равным 2 в манифесте API, Entra ID будет выдавать токены v2.0 с издателем `login.microsoftonline.com/…/v2.0`.
json // App registration manifest of the API: issue v2.0 access tokens { "api": { "requestedAccessTokenVersion": 2 } } - 2.
На время миграции принимайте оба издателя
Перечислите обе формы издателя вашего собственного тенанта; никогда не принимайте произвольных издателей, лишь бы ошибка исчезла.
csharp options.TokenValidationParameters = new TokenValidationParameters { ValidIssuers = [ $"https://login.microsoftonline.com/{tenantId}/v2.0", $"https://sts.windows.net/{tenantId}/", // only while v1.0 tokens are still in circulation ], };