В токене доступа отсутствует утверждение aud

По неизвестной мне причине утверждение "aud" отсутствует в токене доступа (хотя оно присутствует в токене идентификатора).

Как только токен доступа отправляется в API, я получаю следующую ошибку:

Носитель не был аутентифицирован. Сообщение об ошибке: IDX10214: Ошибка проверки аудитории. Аудитории: "пустые". Не соответствует: validationParameters.ValidAudience: 'productconfigurationapi' или validationParameters.ValidAudiences: 'null'.

Я знаю, что могу отключить проверку аудитории, и тогда все будет работать, но я не понимаю, почему "aud" не является частью токена доступа.

Вот моя конфигурация IS4:

клиент:

            new Client
            {
                ClientId = "Spa",
                AllowedGrantTypes = GrantTypes.Implicit,
                AllowAccessTokensViaBrowser = true,
                AlwaysSendClientClaims = true,
                AlwaysIncludeUserClaimsInIdToken = true,
                AccessTokenType = AccessTokenType.Jwt,
                AllowedScopes =
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    "productconfigurationapi"
                },
                RequireConsent = false
            }

ресурс api:

            new ApiResource("productconfigurationapi")
            {
                UserClaims =
                {
                    JwtClaimTypes.Audience
                }
            }

Область применения API:

    return new List<ApiScope>
    {
        new ApiScope("productconfigurationapi")
    };

и вот как IS4 настроен в своем хост-приложении:

        services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            .AddConfigurationStore(options =>
            {
            })
            .AddOperationalStore(options =>
            {
            })
            .AddAspNetIdentity<IdentityUser>()
            .AddJwtBearerClientAuthentication();

1 ответ

Решение

Вы должны привязать ApiScope к ApiResource, установив свойство Scopes:

var api = new ApiResource("productconfigurationapi")
{
    UserClaims =
    {
        JwtClaimTypes.Audience
    },
    Scopes = new List<string>
    {
        "productconfigurationapi"
    },
};
Другие вопросы по тегам