繁体   English   中英

IdentityServer 4在登录/刷新令牌时获取时间戳

[英]IdentityServer 4 get timestamp while login/refresh token

我们正在使用identity server 4来保护 api/资源。 要求之一是跟踪用户活动,这意味着,用户最后一次消费 api(未登录但消费)。 由于我们有 30 多个 api,我们认为一旦令牌通过identity server验证,拦截此验证过程/事件以在数据库中注册最后一个活动日期会更容易。

我的问题是,每次用户想要访问 api 时,这种验证是否真的发生在身份服务器级别?

无论如何要获得此验证时间戳以将其保存在数据库中的某个位置?

谢谢

我能够自己解决这个问题。 我深入研究了 ID-Server 事件,并找到了一种以集中方式处理事件的好方法。 所以这个实现只在 ID-Server 项目中。

身份服务器 4 公开了一些可用于跟踪用户活动的事件(例如:令牌颁发成功、令牌颁发失败、登录失败等...)

有关活动的更多信息,所以这个链接

在身份服务器项目中,我添加了IEventSink接口的实现。 此接口对事件的持久性进行建模并提供一种方法: PersistAsync

这是cs class:

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 实现包含在容器中:

services.AddTransient<IEventSink, IdentityServerEventSink>();

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM