Почему при запросе токена с использованием пароля предоставления и кода авторизации я не получаю те же утверждения?

#asp.net-core #identityserver4

Вопрос:

У меня есть клиент сервера идентификации, настроенный таким образом, чтобы иметь возможность использовать предоставленные пароль и код авторизации, я могу использовать и то, и другое, но при просмотре токенов они не содержат одинаковых утверждений, так ли это должно работать, или мне не хватает какой-то конфигурации?

Если это так работает (разные утверждения в каждом гранте), при использовании предоставления пароля следует ли мне использовать службу профилей для добавления других утверждений?

Комментарии:

1. Вы реализовали IResourceOwnerPasswordValidator себя?

2. Нет, я еще не реализовал.

3. Вы должны и заполните claimsprincipal утверждениями, которые вам нужно отправить (или введите ProfileService и позвольте ему заполнить утверждения для вас). В противном случае по умолчанию отправляется только sub запрос IIRC. github.com/DuendeSoftware/IdentityServer/blob/…

4. Вы используете идентификаторы с ASP.NET Основная идентичность?

5. Ези использую ASP.NET Основная идентичность с идентификаторами

Ответ №1:

Вам необходимо выполнить IResourceOwnerPasswordValidator проверку и вернуть список необходимых вам требований. Реализация по умолчанию отправляет только sub утверждение.

Смотрите пример реализации для ASP.NET Основная идентичность в репо сервера идентификации.

Затем измените его, чтобы отправлять дополнительные заявки. Или использовать ProfileService для его заполнения:

 public virtual async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
{
    var user = await _userManager.FindByNameAsync(context.UserName);
    if (user != null)
    {
        var result = await _signInManager.CheckPasswordSignInAsync(user, context.Password, true);
        if (result.Succeeded)
        {
            var sub = await _userManager.GetUserIdAsync(user);

            _logger.LogInformation("Credentials validated for username: {username}", context.UserName);

            // return additional claims
            var claims = await _userManager.GetClaimsAsync(user);
            context.Result = new GrantValidationResult(sub, AuthenticationMethods.Password, claims);
            return;
        }
    // ... see the link above for a full implementation
}
 

Вы также можете создать новый ClaimsPrincipal для заполнения результатов. GrantValidationResult Другие параметры см. в разделе Перегрузки конструктора.