Как добавить пользовательское утверждение к токену в 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 по умолчанию.