能否修改AspNetIdentity的IdentityUser类以移除不需要的内置属性
AspNetIdentity自定义IdentityUser属性方案
结论
不建议直接修改Identity框架内置的IdentityUser类源码移除属性,推荐使用以下两种官方支持的方案实现需求,后续版本升级也不会受影响:
方案1:继承IdentityUser+EF忽略映射(适配大多数场景)
这个方案可以复用Identity内置的绝大多数功能,只剔除不需要的字段:
- 首先创建自定义用户类继承
IdentityUser
// 可以指定主键类型,默认是string,这里示例用Guid public class CustomUser : IdentityUser<Guid> { // 此处仅添加你自己需要扩展的属性即可 }
- 在DbContext的
OnModelCreating方法中,标记不需要的内置属性为不映射到数据库
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 忽略不需要的内置属性,迁移时不会生成对应表字段 modelBuilder.Entity<CustomUser>() .Ignore(u => u.Email) .Ignore(u => u.EmailConfirmed) .Ignore(u => u.PhoneNumber) .Ignore(u => u.PhoneNumberConfirmed) .Ignore(u => u.TwoFactorEnabled); // 其他不需要的属性均可在此处追加Ignore配置 }
- 同步关闭Identity配置中依赖这些被删除属性的校验规则
builder.Services.AddIdentityCore<CustomUser>(options => { // 移除邮箱、手机号相关的强制校验 options.User.RequireUniqueEmail = false; options.SignIn.RequireConfirmedEmail = false; options.SignIn.RequireConfirmedPhoneNumber = false; }) .AddEntityFrameworkStores<YourDbContext>();
方案2:完全自定义用户类实现IUser接口(适配极简场景)
如果不需要绝大多数Identity内置功能,想要完全自主控制用户表结构,可以直接实现IUser<TKey>接口:
public class CustomUser : IUser<Guid> { // 接口要求实现的最小属性 public Guid Id { get; set; } public string UserName { get; set; } // 仅添加你需要的业务属性,无任何多余内置字段 public string DisplayName { get; set; } }
注意事项
不要直接修改Identity框架的源码删除属性,否则后续升级框架版本时所有修改都会被覆盖,维护成本极高。
内容的提问来源于stack exchange,提问作者Juan Pablo
相关产品推荐
相关产品推荐

