Как добавить пользовательское утверждение к токену в Duende в разделе «Поток учетных данных клиента»?

В настоящее время я использую рабочий поток учетных данных клиента. Я хотел бы расширить поведение IDP и добавить претензии помимо тех, которые распределяются автоматически на основе клиента.

Проверка документов для Client Credential Flow не дала мне многого. Я надеялся на реализацию IProfileServiceно заметил, что он не вызывается (поскольку он обрабатывает утверждения пользователей , а не клиентов). Проверяя документацию других сервисов , я не смог распознать ничего похожего на то, что мне нужно (возможно, из-за путаницы упустил очевидное).

Предположим, что служба обращается к клиенту, передавая правильный идентификатор клиента и секрет, а также GUID в заголовке или в полезных данных вместе с типом гранта и т. д. Теперь я хотел бы выдать JWT с утверждениями на основе на клиенте, но с двумя чередованиями. Частично я хотел бы добавить собственное утверждение (на основе переданного GUID). Частично я хотел бы удалить одно из предоставленных утверждений (также на основе переданного GUID).

Как мне это сделать?

Эти усилия дали мне в основном сведения о материалах Auth0 , а также немного о Curity и других. У Дуэнде тоже должно быть что-то подобное, не так ли?

На этот вопрос есть ответ «нет», но я чувствую, что он неточный. Я не хочу переходить на устаревший поток владельца ресурса (устаревший и требующий взаимодействия с пользователем). Я считаю, что должна быть возможность выбрать пользовательское переданное значение и каким-то образом использовать выданный JWT. Другой ответ предполагает, что это (теоретически) возможно, но они сделали это в Azure, и у меня есть собственный авторитет.

Лучший снимок, который я видел, - это ответ относительно ITokenResponseGenerator. Однако оба упоминают что-то о DI и фабрике, что меня озадачивает, поскольку образцов для проверки нет. Так что попробовать не смогу, к сожалению...

Правильный ли это подход, и если да, то как я могу применить свою собственную реализацию генератора?

1 ответ

Нам нужно расширить класс TokenResponseGenerator в Duende и переопределить ProcessAuthorizationCodeRequestAsync, как показано ниже.

      internal class CustomTokenResponseGenerator : TokenResponseGenerator
{
    public CustomTokenResponseGenerator(ISystemClock clock, ITokenService tokenService, IRefreshTokenService refreshTokenService, IScopeParser scopeParser, IResourceStore resources, IClientStore clients, ILogger<TokenResponseGenerator> logger) : base(clock, tokenService, refreshTokenService, scopeParser, resources, clients, logger)
    {
    }
    protected override async Task<TokenResponse> ProcessAuthorizationCodeRequestAsync(TokenRequestValidationResult request)
    {
        var result = await base.ProcessAuthorizationCodeRequestAsync(request);

        if (result != null)
        {
            //If you need to get user details you can use below context
            
             var user = request.ValidatedRequest.Subject; 
             var userClaims = user.Claims;  
           
             if (result.Custom == null)
             {
                result.Custom = new Dictionary<string, object>();
             }
             result.Custom.Add("CustomProperty","SomeValue");
        }

        return result;
    }
}

После того, как мы определили вышеуказанную реализацию, мы можем зарегистрироваться в DI.

      builder.Services.AddTransient<ITokenResponseGenerator, CustomTokenResponseGenerator>();

Это переопределит реализацию Duende по умолчанию.

Другие вопросы по тегам