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

能否将SecurityStamp列迁移至AspNetUsers以外的其他表?

将SecurityStamp移至单独表的实现方案

可以实现,但无法仅通过简单配置完成,需要自定义Identity实体、DbContext以及UserStore来实现,具体步骤如下:

  • 创建SecurityStamp存储实体
    新建一个实体类来单独存储用户的SecurityStamp:

    public class UserSecurityStamp
    {
        public string UserId { get; set; }
        public string SecurityStamp { get; set; }
        public virtual ApplicationUser User { get; set; }
    }
    
  • 修改ApplicationUser实体
    在自定义的用户实体中添加与UserSecurityStamp的关联导航属性:

    public class ApplicationUser : IdentityUser
    {
        public virtual UserSecurityStamp UserSecurityStamp { get; set; }
    }
    
  • 配置DbContext
    在数据库上下文类中,忽略原ApplicationUser表的SecurityStamp列,同时配置新实体的表关系:

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public DbSet<UserSecurityStamp> UserSecurityStamps { get; set; }
    
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            
            // 忽略原用户表中的SecurityStamp列
            builder.Entity<ApplicationUser>().Ignore(u => u.SecurityStamp);
            
            // 配置新表的主键与关联关系
            builder.Entity<UserSecurityStamp>()
                .HasKey(uss => uss.UserId);
            builder.Entity<UserSecurityStamp>()
                .HasOne(uss => uss.User)
                .WithOne(u => u.UserSecurityStamp)
                .HasForeignKey<UserSecurityStamp>(uss => uss.UserId);
        }
    }
    
  • 自定义UserStore处理SecurityStamp读写
    重写默认UserStore中与SecurityStamp相关的方法,让操作指向新表:

    public class CustomUserStore : UserStore<ApplicationUser>
    {
        private readonly DbSet<UserSecurityStamp> _securityStamps;
    
        public CustomUserStore(ApplicationDbContext context, IdentityErrorDescriber describer = null) 
            : base(context, describer)
        {
            _securityStamps = context.UserSecurityStamps;
        }
    
        public override async Task SetSecurityStampAsync(ApplicationUser user, string stamp, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            var securityStamp = await _securityStamps.FindAsync(new object[] { user.Id }, cancellationToken) 
                                 ?? new UserSecurityStamp { UserId = user.Id };
            securityStamp.SecurityStamp = stamp;
            
            if (!_securityStamps.Local.Contains(securityStamp))
            {
                _securityStamps.Add(securityStamp);
            }
            await Context.SaveChangesAsync(cancellationToken);
        }
    
        public override async Task<string> GetSecurityStampAsync(ApplicationUser user, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            var securityStamp = await _securityStamps.FindAsync(new object[] { user.Id }, cancellationToken);
            return securityStamp?.SecurityStamp;
        }
    }
    
  • 注册自定义UserStore
    在Startup的服务配置中,替换默认的UserStore为自定义实现:

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddUserStore<CustomUserStore>()
        .AddDefaultTokenProviders();
    

完成以上步骤后,SecurityStamp就会存储在单独的UserSecurityStamps表中,同时不影响ASP.NET Identity的正常功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:20:53