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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:52:47