Я использую пароль владельца ресурса большого типа. Я реализовал 2 интерфейса: IResourceOwnerPasswordValidator
и IProfileService
. Когда я запрашиваю токен, я попадаю на ResourceOwnerPasswordValidator
, после успешной проверки я ожидаю, что ProfileService
предоставляет мне запрошенные климы. Но это никогда не происходит.
Дело в том, что RequestedClaimTypes
из ProfileDataRequestContext
в ProfileService
всегда пусто, в результате я не могу отфильтровать претензии, которые не были заданы. Я ожидаю, что он содержит все претензии, связанные с запрошенными областями. Например, если я запрашиваю такие области как email
или "profile"
, я ожидаю, что такие заявки, как "email"
, "first_name"
, "preferred_username"
и другие, будут в списке RequestedClaimTypes
. Существует простая конфигурация клиентов и ресурсов идентификации:
return new List<IdentityResource>
{
new IdentityResources.OpenId(),
new IdentityResources.Profile(),
new IdentityResources.Email()
};
...........................................................................
new Client
{
ClientId = "client",
ClientName = "SomeClient",
ClientSecrets = { new Secret("secret".Sha256()) },
AllowOfflineAccess = true,
UpdateAccessTokenClaimsOnRefresh = true,
RefreshTokenUsage = TokenUsage.ReUse,
SlidingRefreshTokenLifetime = 1200,
RefreshTokenExpiration = TokenExpiration.Sliding,
AccessTokenLifetime = 900,
IdentityTokenLifetime = 120,
AllowedGrantTypes = { GrantType.ResourceOwnerPassword },
AccessTokenType = AccessTokenType.Jwt,
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.Email
}
},
Интересным фактом является то, что RequextedResource
из ProfileDataRequestContext
имеет данные о претензиях, которые я могу использовать, чтобы выяснить, какие претензии запрашивал пользователь. Например:
var claimsNames = new List<string>();
claimsNames.AddRange(context.RequestedResources.IdentityResources.SelectMany(r => r.UserClaims));
claimsNames.AddRange(context.RequestedResources.ApiResources.SelectMany(r => r.UserClaims));
context.RequestedClaimTypes = claimsNames;
Но, похоже, это хакерский путь. Кто-нибудь знает, почему RequestedClaimTypes
не заполняется автоматически?
PS Клиент - почтальон со следующими параметрами