IdentityServer 4 получает метку времени при входе в систему / обновлении токена - PullRequest
0 голосов
/ 17 октября 2019

Мы используем identity server 4 для защиты API / ресурсов. Одним из требований является отслеживание активности пользователя, что означает, когда пользователь в последний раз использовал API (не вошел в систему, но использовал). Поскольку у нас есть 30+ apis, мы подумали, что будет проще перехватить этот процесс / событие проверки, чтобы зарегистрировать в базе данных дату последней активности после того, как токен будет проверен по identity server.

Мой вопрос здесь,действительно ли эта проверка происходит на уровне сервера идентификации каждый раз, когда пользователь хочет получить доступ к API?

Есть ли возможность получить эту временную метку проверки, чтобы сохранить ее где-нибудь в базе данных?

спасибо

1 Ответ

0 голосов
/ 22 октября 2019

Я смог решить эту проблему сам. Я больше копался в событиях ID-сервера и нашел хороший способ обработки событий централизованным способом. Таким образом, эта реализация существует только в проекте ID-Server.

Identity Server 4 предоставляет некоторые виды событий, которые можно использовать для отслеживания действий пользователя (например, токен успешно выдан, токен не выполнен, вход в систему не выполнен и т. Д.). ..)

Для получения дополнительной информации о событии, вот эта ссылка

В проекте сервера идентификации я добавил реализацию интерфейса IEventSink. Этот интерфейс моделирует постоянство событий и предоставляет один метод: PersistAsync.

Вот класс cs:

public class IdentityServerEventSink : IEventSink
{
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly UserManager<IdentityUser> _userManager;

        public IdentityServerEventSink(IHttpContextAccessor httpContextAccessor,
                                       UserManager<IdentityUser> userManager)
        {
            _httpContextAccessor = httpContextAccessor;
            _userManager = userManager;
        }

        public async Task PersistAsync(Event @event)
        {
            if (@event.Id.Equals(EventIds.ClientAuthenticationFailure) || @event.Id.Equals(EventIds.TokenIssuedSuccess) || @event.Id.Equals(EventIds.TokenIssuedFailure))
            {
                Identity user = null;

                try
                {
                    user = await _userManager.GetUserAsync(_httpContextAccessor.HttpContext.User);

                    if (user != null)
                    {
                       // do stuff
                    }
                }
                catch (Exception ex)
                {
                  // handle exception
                }
            }
        }
}

Через DI я вводю IHttpContextAccessor, поэтому вам нужно добавить эту строку в конфигурации служб:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

И эта строка для включения реализации IEventSink в conatiner:

services.AddTransient<IEventSink, IdentityServerEventSink>();

надеюсь, это поможет!

...