Для контекста:
- Поставщик удостоверений работает на IdentityServer4
- API работает. NET Framework 4.6.1 использует расширение IdentityServer3.AccessTokenValidation для связи с сервером удостоверений.
- Получение действительного токена доступа для пользователя с сервера идентификации с использованием кода авторизации + поток PKCE
Когда я вызываю API с токеном доступа, API отклоняет токен доступа с помощью следующее сообщение об ошибке:
Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationMiddleware Error: 0 : Authentication failed
System.IdentityModel.Tokens.SecurityTokenInvalidAudienceException: IDX10214: Audience validation failed. Audiences: '<apiResourceName>'. Did not match: validationParameters.ValidAudience: '<identityProviderBaseUri>/resources' or validationParameters.ValidAudiences: 'null'
at System.IdentityModel.Tokens.Validators.ValidateAudience(IEnumerable`1 audiences, SecurityToken securityToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateAudience(IEnumerable`1 audiences, SecurityToken securityToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateToken(String securityToken, TokenValidationParameters validationParameters, SecurityToken& validatedToken)
at Microsoft.Owin.Security.Jwt.JwtFormat.Unprotect(String protectedText)
at Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationHandler.<AuthenticateCoreAsync>d__0.MoveNext()
Я не могу сказать, что я должен изменить, вот содержимое JWT, который я передаю:
{
"nbf": 1582197029,
"exp": 1582200629,
"iss": "<identityProviderBaseUri>",
"aud": "<apiResourceName>",
"client_id": "<clientId>",
"sub": "<userId>",
"auth_time": 1582197028,
"idp": "local",
"email": "<userEmail>",
"scope": [
"openid",
"profile",
"<apiResourceName>",
"offline_access"
],
"amr": [
"pwd"
]
}
А вот мое использование IdentityServer3 в. NET Framework API:
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "<identityProviderBaseUri>",
RequiredScopes = new string[] { "<apiResourceName>" }
});
Есть идеи, почему промежуточное ПО отклоняет мой маркер доступа? Примеры, которые я нашел (включая быстрый запуск identityserver4), отражают вышесказанное - хотя быстрый запуск предоставляет свойство аудитории, а не «RequiredScopes»; другие SO сообщения, которые я обнаружил, похоже, не соответствуют моей проблеме.
Если какая-либо дополнительная информация будет полезна, сообщите мне.
Спасибо
Редактировать: Удалена ссылка на локальный хост для согласованности