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

使用自定义CookieAuthenticationEvents时SecurityStampValidator未触发的问题及解决

.NET 7中自定义CookieAuthenticationEvents导致SecurityStampValidator失效的原因及解决方法

问题原因

当通过options.EventsType = typeof(CustomCookieAuthenticationEvents)配置自定义Cookie认证事件类型时,ASP.NET Core Identity默认注册的OnValidatePrincipal事件处理逻辑(即SecurityStampValidator的安全戳验证逻辑)会被完全覆盖。由于你的CustomCookieAuthenticationEvents是空白类,没有继承或调用原有的验证逻辑,导致安全戳验证流程中断,因此即使配置SecurityStampValidatorOptions也不会产生效果。

解决方法

方法一:在自定义事件类中集成默认验证逻辑

修改CustomCookieAuthenticationEvents类,通过依赖注入引入SecurityStampValidator,并重写ValidatePrincipal方法执行默认验证逻辑,同时可添加自定义扩展逻辑:

public class CustomCookieAuthenticationEvents : CookieAuthenticationEvents
{
    private readonly SecurityStampValidator<IdentityUser> _securityStampValidator;

    public CustomCookieAuthenticationEvents(SecurityStampValidator<IdentityUser> securityStampValidator)
    {
        _securityStampValidator = securityStampValidator;
    }

    public override async Task ValidatePrincipal(CookieValidatePrincipalContext context)
    {
        // 执行默认的安全戳验证
        await _securityStampValidator.ValidateAsync(context);
        
        // 此处可添加你的自定义Cookie验证逻辑
    }
}

方法二:手动注册验证逻辑到Cookie配置中

在ConfigureApplicationCookie配置里,手动将SecurityStampValidator的验证逻辑绑定到OnValidatePrincipal事件,同时保留自定义事件类型:

builder.Services.ConfigureApplicationCookie(options =>
{
    options.EventsType = typeof(CustomCookieAuthenticationEvents);
    
    // 手动注入并执行安全戳验证逻辑
    options.Events.OnValidatePrincipal = async context =>
    {
        var validator = context.HttpContext.RequestServices.GetRequiredService<SecurityStampValidator<IdentityUser>>();
        await validator.ValidateAsync(context);
    };
});

两种方法中,方法一更符合依赖注入的设计原则,也便于后续扩展自定义验证逻辑,推荐优先使用。

内容的提问来源于stack exchange,提问作者JGH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:50:24