Я хотел бы знать, как мы можем зарегистрировать сгенерированный Refre sh & AccessToken в IdentityServer 4.
В настоящее время у нас есть пользовательская реализация JwtAccessToken, и мы записываем ее + userId / name в центральную систему ведения журнала всякий раз, когда он генерирует новый токен доступа. Для Apis (у нас их более 10), он всегда записывает все входящие запросы + JwtToken в одну и ту же систему регистрации. Таким образом, мы можем легко отследить, что пользователь сделал, и увидеть журналы / значения в это конкретное время.
Теперь мы собираемся заменить эту пользовательскую реализацию безопасности на IDSV4, и мы не смогли найти способ войти созданный токен в IDSV4.
Мы знаем, что мы можем получить токен доступа. Net Приложение с помощью await HttpContext.GetAccessTokenAsync()
. Но мы не хотим вручную отправлять журнал из всех наших приложений (. Net, Spas, Apis (Client Credentials)), которые собираются интегрировать с IDSV. Мы хотим управлять этой регистрацией AccessToken в центральном месте, как мы делали раньше.
Я посмотрел на исходный код IDSV4 TokenEndpoint.cs Line120, LogTokens()
if (response.IdentityToken != null)
{
_logger.LogTrace("Identity token issued for {clientId} / {subjectId}: {token}", clientId, subjectId, response.IdentityToken);
}
if (response.RefreshToken != null)
{
_logger.LogTrace("Refresh token issued for {clientId} / {subjectId}: {token}", clientId, subjectId, response.RefreshToken);
}
if (response.AccessToken != null)
{
_logger.LogTrace("Access token issued for {clientId} / {subjectId}: {token}", clientId, subjectId, response.AccessToken);
}
На самом деле, они пишут TraceLogs для реальных токенов. Но мы не хотим обновлять уровень журнала до Trace, потому что это затопит нашу систему ведения журналов.
Итак, я хотел бы знать, возможно ли реализовать функцию записи сгенерированных токенов в журнал всякий раз, когда IDSV4 выдает AccessToken. Есть ли способ перехватить эти токены после генерации?
Или мы должны вручную регистрировать AccessTokens всякий раз, когда они генерируются или обновляются во всех наших клиентах?
Обновление : Спасибо sellotape за идею для DI. Ниже приведен правильный класс для перехвата сгенерированного токена:
public class CustomTokenResponseGenerator : TokenResponseGenerator
{
public CustomTokenResponseGenerator(ISystemClock clock, ITokenService tokenService, IRefreshTokenService refreshTokenService, IResourceStore resources, IClientStore clients, ILogger<TokenResponseGenerator> logger) : base(clock, tokenService, refreshTokenService, resources, clients, logger)
{
}
public override async Task<TokenResponse> ProcessAsync(TokenRequestValidationResult request)
{
var result = await base.ProcessAsync(request);
// write custom loggings here
return result;
}
}
После этого вы можете заменить класс по умолчанию из IDSV4 своим пользовательским классом
services.Replace(ServiceDescriptor.Transient<ITokenResponseGenerator, CustomTokenResponseGenerator>());