Как я могу записать сгенерированный токен доступа в Identity Server 4? - PullRequest
0 голосов
/ 20 марта 2020

Я хотел бы знать, как мы можем зарегистрировать сгенерированный 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>());

1 Ответ

1 голос
/ 20 марта 2020

Есть много мест для этого; Один из них - создать собственную реализацию ITokenService, наследуя от DefaultTokenService.

Override CreateAccessTokenAsync(), и сделайте так:

Token result = await base.CreateAccessTokenAsync(request);
// Your logging goes here...
return result;

Поменяйте местами свою версию в контейнере DI при запуске (убедитесь, что это после того, как по умолчанию уже был добавлен):

services.Replace<ITokenService, MyTokenService>();

... и вы должны быть готовы.


В сторону, вы должны действительно регистрируйте хэши ваших токенов, а не сами токены. Вы по-прежнему можете сопоставлять запросы и действия с пользователями на основе ха sh, но тогда, по крайней мере, никто не сможет использовать данные журналов для олицетворения любого из ваших пользователей.

...