Сообщение об ошибке
IDX10511: Signature validation failed. Keys tried:
Также выводится как
- Bearer error="invalid_token", error_description="The signature is invalid"
Остальная часть сообщения перечисляет опробованные ключи (они скрыты как `[PII … is hidden]`, если не включён `ShowPII`), количество ключей, откуда взят найденный ключ, и `kid`.
Microsoft.IdentityModel.JsonWebTokens / System.IdentityModel.Tokens.Jwt (.NET) — SecurityTokenInvalidSignatureException
Что это означает
В отличие от IDX10503, ключ с `kid` токена нашёлся («Matched key was in 'TokenValidationParameters'» или «…'Configuration'»), но подпись с ним всё равно не прошла проверку. Либо у двух разных ключей один и тот же идентификатор ключа, либо токен изменили после подписания. ASP.NET Core отвечает `error_description="The signature is invalid"`.
Почему это происходит
Два ключа с одинаковым kid
частоИдентификаторы ключей, выбранные по имени (`signing-key`, `default`, `rsa1`), совпадают, когда каждое окружение или каждое развёртывание генерирует свой ключ. Валидатор выбирает ключ по `kid`, и подпись не проходит проверку.
Заголовок или полезная нагрузка изменены после подписания
иногдаПовторное кодирование на шлюзе, обрезка или тестовый код, который правит утверждения в существующем токене.
Разные байты для одного и того же секрета HMAC
иногдаС HS256 и `kid` одна сторона может строить ключ из текста в UTF-8, а другая — из байтов, декодированных из base64. Идентификатор ключа совпадает, а сам ключ — нет.
Как исправить
- 1.
Используйте идентификаторы ключей на основе отпечатка
`kid`, вычисленный из материала ключа (RFC 7638), может совпасть, только если совпадают сами ключи.
csharp // Derive kid from the key itself (RFC 7638 thumbprint) so different keys never share an ID. var jwk = JsonWebKeyConverter.ConvertFromECDsaSecurityKey(new ECDsaSecurityKey(ecdsa)); var key = new ECDsaSecurityKey(ecdsa) { KeyId = Base64UrlEncoder.Encode(jwk.ComputeJwkThumbprint()) }; - 2.
Договоритесь о байтах секрета
Храните общий секрет в кодировке base64 и декодируйте его одинаково на обеих сторонах.
csharp // HS256: issuer and API must build the key from the same bytes. var secret = Convert.FromBase64String(builder.Configuration["Jwt:SecretBase64"]!); // >= 32 bytes var signingKey = new SymmetricSecurityKey(secret);
Связанные ошибки
IDX10503: Signature validation failed. The token's kid is: '2026-10', but did n…Microsoft.IdentityModel.JsonWebTokens / System.IdentityModel.Tokens.Jwt (.NET)Signed JWT rejected: Invalid signatureNimbus JOSE + JWT (Java)failed to verify signature: failed to verify id token signaturecoreos/go-oidc (Go)