ala*_*egh 1 c# access-token asp.net-web-api2 bearer-token identityserver4
我们用来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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过 DI,我正在注入IHttpContextAccessor,因此您需要在服务配置中添加此行:
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)
此行将 IEventSink 实现包含在容器中:
services.AddTransient<IEventSink, IdentityServerEventSink>();
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
1199 次 |
| 最近记录: |