能否将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
相关产品推荐
相关产品推荐

