.NET Core 3.1 Identity识别持久化Cookie时添加记录事件的位置咨询
你需要在Identity的Cookie认证验证流程中注入自定义逻辑,核心入口是OnValidatePrincipal事件回调,该事件会在每次请求验证Cookie有效性通过后触发,覆盖手动登录、持久化Cookie自动登录所有场景。
实现步骤
1. 配置Cookie认证事件
在Startup.cs的ConfigureServices方法中,配置应用Cookie的事件回调,代码如下:
using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.EntityFrameworkCore; using System.Security.Claims; // 放在你原有服务注册的位置 services.ConfigureApplicationCookie(options => { // 保留你原有的Cookie配置,比如7天滑动过期 options.ExpireTimeSpan = TimeSpan.FromDays(7); options.SlidingExpiration = true; // 新增验证通过后的事件回调 options.Events.OnValidatePrincipal = async context => { // 仅处理已认证的请求 if (context.Principal?.Identity?.IsAuthenticated != true) return; // 从Claims中获取当前用户ID var userId = context.Principal.FindFirstValue(ClaimTypes.NameIdentifier); if (string.IsNullOrEmpty(userId)) return; // 从请求容器中获取数据库上下文 var dbContext = context.HttpContext.RequestServices.GetRequiredService<你的数据库上下文类名>(); // 检查24小时内是否已经记录过该用户的Cookie自动登录事件,避免重复写入 var hasRecentRecord = await dbContext.你的登录事件表名 .AnyAsync(e => e.UserId == userId && e.登录类型字段 == "PersistentCookieAutoLogin" && e.创建时间字段 >= DateTimeOffset.UtcNow.AddDays(-1)); if (!hasRecentRecord) { // 新增自动登录事件记录 dbContext.你的登录事件表名.Add(new 你的登录事件实体类 { UserId = userId, 登录类型字段 = "PersistentCookieAutoLogin", IP地址字段 = context.HttpContext.Connection.RemoteIpAddress?.ToString(), UserAgent字段 = context.HttpContext.Request.Headers["User-Agent"].ToString(), 创建时间字段 = DateTimeOffset.UtcNow }); await dbContext.SaveChangesAsync(); } }; });
2. 适配你的业务代码
- 将代码中的
你的数据库上下文类名、你的登录事件表名、你的登录事件实体类替换为你项目中对应的实际名称 - 登录事件的字段可根据你现有行为追踪的规则调整,和手动登录的事件类型做区分即可
注意事项
- 该回调会在每次有效请求触发,增加24小时的查重逻辑既满足你每天至少记录一次的需求,也避免了频繁写入数据库
- 建议统一使用UTC时间存储和判断,避免时区不同导致的查重逻辑异常
- 若需要优化性能,可引入分布式缓存存储最近24小时已记录的用户ID,缓存过期时间设为24小时,优先查缓存减少数据库访问压力
内容的提问来源于stack exchange,提问作者christopher achard
相关产品推荐
相关产品推荐

