Я смог решить эту проблему сам. Я больше копался в событиях 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>();
надеюсь, это поможет!