Все началось с того, что я обновил .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 для управления ресурсами и конфигурацией.
Я также проверил другие сообщения здесь и подобные, но, к сожалению, ни один из них не помог!