You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 3.1 Identity识别持久化Cookie时添加记录事件的位置咨询

ASP.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:24:04