Я подозреваю, что исключение, которое вы получаете при попытке объявить свой собственный луч JwtDecoder , происходит от косой черты, которая отсутствует.
Обратите внимание, что " запрошенный эмитент"всегда отсутствует конечная косая черта, даже если она была явно указана с косой чертой в конфигурации.
Spring Security удаляет любую косую черту из URI эмитентаперед добавлением, как того требует спецификация. Однако после извлечения конфигурации URI издателя возвращенной конфигурации сопоставляется с «очищенной» версией URI проблемы, а не с изначально предоставленным.
Поскольку fromOidcIssuerLocation () не знает о первоначально предоставленном URL-адресе эмитента, он сопоставляется с cleanedIssuer, что вызывает описанную проблему. Самый простой способ решить эту проблему - выполнить очистку в из функцииOidcIssuerLocation () , которая по-прежнему имеет исходную версию, доступную для сопоставления.
Еще одно примечание, связанное с первым заданным вами вопросом.
Если я знаю идентификатор вашего API + идентификатор вашего арендатора, я могу получить токен доступа для вашего API, используя учетные данные клиента! Маркер не будет содержать области или роли, он не может. Поэтому крайне важно проверить наличие действительных делегированных разрешений (или областей действия) или допустимых разрешений приложений (в утверждении о ролях).
Посмотрите на этот конкретный код.
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
TokenValidationParameters validationParameters = new TokenValidationParameters
{
// We accept both the App Id URI and the AppId of this service application
ValidAudiences = new[] { audience, clientId },
// Supports both the Azure AD V1 and V2 endpoint
ValidIssuers = new[] { issuer, $"{issuer}/v2.0" },
IssuerSigningKeys = signingKeys
};