获取用户上次访问时间

时间:2018-02-10 05:43:36

标签: c# asp.net-core entity-framework-core identityserver4

我正在为我的asp.net核心API使用IdentityServer 4(带有sql存储)。我想在数据库中的某处添加“Last Accessed”字段,该字段可用于在用户搜索端点中对我的一个用户类型进行排序。理想情况下,这将显示他们最后一次在系统中执行操作。

如果我在登录方法中这样做,它将不准确,因为它只会在最初生成令牌时更新。我可以为用户访问的每个端点添加一个方法,但这不是正确的解决方案,因为它会重复我自己。

维护记录上次用户访问系统的数据库字段的正确位置和方法是什么?

2 个答案:

答案 0 :(得分:0)

为了记录用户活动时间,您可以尝试使用每个请求都会调用的中间件 这是步骤 1.将字段添加到ApplicationUser,存储上次访问的时间

public class ApplicationUser : IdentityUser
{       
    public DateTime LastAccessed { get; set; }
}

2.运行命令添加迁移LastAccessed 更新数据库
3.添加中间件以根据用户名

更新上次访问的时间
        app.UseAuthentication();
        app.Use(async (context, next) => {
            await next.Invoke();
            //handle response
            //you may also need to check the request path to check whether it requests image
            if (context.User.Identity.IsAuthenticated)
            {
                var userName = context.User.Identity.Name;
                //retrieve uer by userName
                using (var dbContext = context.RequestServices.GetRequiredService<ApplicationDbContext>())
                {
                    var user = dbContext.ApplicationUser.Where(u => u.UserName == userName).FirstOrDefault();
                    user.LastAccessed = DateTime.Now;
                    dbContext.Update(user);
                    dbContext.SaveChanges();
                }
            }
        });

答案 1 :(得分:0)

我为identity server项目(使用IEventSink)中的集中式解决方案做了一个类似的问题,添加了答案。我们拥有30多种api,我发现最好只在一个地方进行解决方案,而不是在每个api中都做。所以我在这里添加了这个答案,以防万一有人碰到并有与我相同的要求。这是我的answer