我们identity server 4
用来保护api /资源。要求之一是跟踪用户活动,这意味着用户最后一次使用api(未登录但已使用)。由于我们拥有30多种api,因此我们认为,一旦令牌针对进行了验证,拦截此验证过程/事件以在数据库中注册最后一个活动日期将更加容易identity server
。
我的问题是,此验证是否确实在每次用户想要访问api时都在身份服务器级别上进行?
无论如何,有没有要获取此验证时间戳以将其保存在数据库中的某个位置?
谢谢
我自己能够解决这个问题。我对ID-Server事件进行了更深入的研究,找到了一种集中处理事件的好方法。因此,此实现仅在ID-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>();
希望这可以帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句