Обновлен IdentityServer4 - не удалось проверить ожидаемый openid области

Все началось с того, что я обновил .Net Core 2.1 до Core 3.1, для этого я также обновил IdentityServer4 v2.3 до v4. В базе данных было много изменений с точки зрения миграций, а также зависимостей. Все работает, за исключением того, что теперь я получаю следующую ошибку при попытке войти в систему с использованием внешнего провайдера. (на данный момент мы используем только внешнего провайдера входа в систему, в данном случае Google)

fail: IdentityServer4.Validation.TokenValidator[0]
      Checking for expected scope openid failed
{
        "ValidateLifetime": true,
        "AccessTokenType": "Jwt",
        "ExpectedScope": "openid",
        "Claims": {
          "nbf": 1601023633,
          "exp": 1601023933,
          "iss": "xx-local",
          "client_id": "xx",
          "sub": "89e9001c-dda2-4938-8f3f-4285b160ac42",
          "auth_time": 1601023633,
          "idp": "google",
          "email": "[email protected]",
          "roles": "tech",
          "iat": 1601023633,
          "scope": [
            "cc",
            "offline_access"
          ],
          "amr": "google"
        }
      }

Ну, ошибка говорит, что отсутствует необходимая область, которая является OpenID, поэтому я убедился, что она добавлена ​​​​в мой клиент при создании клиента, а также проверила ее в базе данных.

new Client
            {
                ClientId = "xx",
                ClientName = " xx Portal",
                AllowedGrantTypes =
                    {
                        GrantType.ResourceOwnerPassword, "external"
                    },
                AllowAccessTokensViaBrowser = true,
                RedirectUris = { },
                PostLogoutRedirectUris = { },
                AllowedScopes = {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    "cc"
                },
                RequireConsent = false,
                AllowOfflineAccess = true,
                ClientSecrets = {new Secret("secret".Sha256())},
                RequireClientSecret = false,
                UpdateAccessTokenClaimsOnRefresh = true,
                AccessTokenLifetime = 300,
                RefreshTokenUsage = TokenUsage.ReUse,
                RefreshTokenExpiration = TokenExpiration.Sliding
            },

Я также создал ApiScopes и Resources для представления областей, они также зарегистрированы в файле startup.cs.

    public static IEnumerable<ApiResource> GetApiResources()
    {
        return new List<ApiResource>
        {
            new ApiResource("cc", "CC", new[] { JwtClaimTypes.Subject, JwtClaimTypes.Email }),
        };
    }


    public static IEnumerable<ApiScope> GetApiScopes()
    {
        return new List<ApiScope>
        {
            new ApiScope(name: "cc",   displayName: "CC"),
        };
    }


    public static IEnumerable<IdentityResource> GetIdentityResources()
    {
        return new List<IdentityResource>
        {
            new IdentityResources.OpenId(),
            new IdentityResources.Profile(),
        };
    }

Редактировать:

Я только что заметил, что в документе обнаружения в списке поддерживаемых областей у меня нет ни OpenId, ни профиля.

  "scopes_supported": [
    "cc",
    "offline_access"
  ],

Я использую EF для управления ресурсами и конфигурацией.

Я также проверил другие сообщения здесь и подобные, но, к сожалению, ни один из них не помог!


person user65248    schedule 25.09.2020    source источник


Ответы (1)


Что вам нужно сделать, так это создать ApiScopes для представления областей, к которым пользователь может запросить доступ. В более ранней версии ваши области были привязаны к ApiResources.

Итак, в версии 4 у вас есть IdentityResources и ApiScopes для представления областей, к которым пользователь может запросить доступ.

См. эту ссылку:

Еще одна вещь, см. это исходный код:

В нем есть два параметра конфигурации, которые определяют, включено ли то, что включено в документ обнаружения:

    /// <summary>
    /// Show identity scopes
    /// </summary>
    public bool ShowIdentityScopes { get; set; } = true;

    /// <summary>
    /// Show API scopes
    /// </summary>
    public bool ShowApiScopes { get; set; } = true;

Возможно, ShowIdentityScopes ложны, и поэтому вы их не видите?

person Tore Nestenius    schedule 25.09.2020
comment
Спасибо, извините, я не указал достаточно подробностей в своем посте, я уже сделал все это, но ничего не изменилось. Как я упоминал в редактировании поста, у меня нет OpenID или профиля в моем списке поддерживаемых областей в документе обнаружения. - person user65248; 25.09.2020
comment
Вам необходимо добавить область openid и профиля к вашему ресурсу идентификации, как и раньше, а также к вашему определению клиента. - person Tore Nestenius; 25.09.2020
comment
Конечно, я добавил OpenId и Profile в свои ApiScopes, и это решило проблему. Однако при проверке документа Discovery поддерживаемые_требования теперь пусты! - person user65248; 25.09.2020
comment
две области должны быть добавлены в indentityResource, а не в AopScopes. В противном случае, я думаю, вы получите информацию о профиле в токен доступа. Он должен войти в ID-токен и, следовательно, на него можно будет сослаться в ID-токене. - person Tore Nestenius; 25.09.2020
comment
Но они у меня уже есть (см. редактирование), если я не добавлю их в ApiScope, они не появятся в документе обнаружения, и в результате я получаю ту же ошибку! - person user65248; 25.09.2020
comment
ах, это работает, поэтому я удалил то, что добавил в apiScopes, и убедился, что IdentityResources был зарегистрирован в startup.cs, спасибо за вашу помощь. - person user65248; 25.09.2020
comment
Спасибо, да, я видел эти варианты раньше, но моя проблема заключалась в том, что я вообще не регистрировал их на IdentityServer, что теперь решено :) - person user65248; 25.09.2020