错误信息
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`)比对,或者反过来。
原因
用 v2.0 颁发者验证 Entra ID v1.0 令牌(或反过来)
常见令牌版本由 API 的应用注册(`requestedAccessTokenVersion`)决定,而不是由客户端使用的端点决定。除非在清单中另行指定,否则期望 v2.0 令牌的 API 收到的会是 v1.0 令牌。
来自其他租户的令牌
常见多租户应用收到的令牌,其颁发者中包含用户所在租户的 ID。单个 `ValidIssuer` 只接受一个租户;多租户 API 需要一个颁发者验证器,对照允许列表检查租户。
写法差异
偶见按字符串精确比较,末尾斜杠、主机名大写、`/v2.0` 后缀和 B2C 策略路径都会导致不匹配。直接从发现文档中复制该值。
修复方法
- 1.
从源头修正令牌版本
在 API 的清单中把 `requestedAccessTokenVersion` 设为 2,Entra ID 就会签发颁发者为 `login.microsoftonline.com/…/v2.0` 的 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 ], };