.NET Core 5 API中不使用IdentityUser及IdentityRoles实现JWT认证的技术咨询
问题:.NET Core 5 API中基于现有自定义用户表实现JWT认证(不继承IdentityUser)
我已经耗了2-3天在.NET Core 5 API里调试JWT认证功能,愣是没取得实质性进展,也没找到完全贴合我需求的解决方案。
我的情况是这样的:我需要基于一个已有的数据库来实现API,这个数据库已经通过EF Core配置了自定义用户类MyCustomUser,而且我绝对不能让这个类继承IdentityUser——因为有个旧应用依赖这个数据库,它不需要通过我的API就能完成认证,为了兼容性,我根本没法修改数据库里的任何字段,也不能添加新表。
现有用户表包含UserMail、Username和RoleId等字段,我的自定义用户类定义如下:
public class MyCustomUser { public int UserId { get; set; } public string Username { get; set; } public byte[] Password { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string UserMail { get; set; } public int RoleId { get; set; } // [...] }
我必须避免让MyCustomUser继承IdentityUser的写法,因为这样会导致大量字段冲突,还会破坏数据库兼容性,比如下面这种写法就是我要避开的:
// 这种写法会引发字段冲突及数据库兼容问题,绝对不能用 public class MyCustomUser: IdentityUser { public int UserId { get; set; } public string Username { get; set; } // 和基类的UserName字段冲突 public byte[] Password { get; set; } // 和基类的PasswordHash字段冲突 public string FirstName { get; set; } public string LastName { get; set; } public string UserMail { get; set; } // 和基类的Email字段冲突 public int RoleId { get; set; } // 基类无对应字段,会触发数据库结构变更 // 基类自动生成的以下字段,会和我现有表结构完全冲突 // --------------------------------------------------- public virtual string UserName { get; set; } public virtual string NormalizedUserName { get; set; } [ProtectedPersonalData] public virtual string Email { get; set; } public virtual string NormalizedEmail { get; set; } [PersonalData] public virtual bool EmailConfirmed { get; set; } public virtual string PasswordHash { get; set; } }
我现在的疑问是:能不能不继承IdentityUser,而是通过配置的方式让Identity框架使用我的自定义字段?比如我试着写了这样的配置代码,但不确定是否可行:
public void ConfigureServices(IServiceCollection services) { services.AddEntityFramework() .AddSqlServer() .AddDbContext<MyCustomDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])); services.AddIdentity<MyCustomUser, MyCustomRole>(); // [...] }
我已经查了不少相关资料,包括Identity的入门教程、IdentityServer4从现有数据库获取用户的内容,还有Code First结合IdentityUser的文章,但这些资料全都是基于全新的IdentityUser实现的,完全不匹配我的现有数据库场景,没找到明确的答案。
内容的提问来源于stack exchange,提问作者Samuel Montambault
相关产品推荐
相关产品推荐

