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

Blazor Server Side中如何扩展Identity框架的User用户表?

Blazor Identity模块向User表添加自定义字段实现方案

完全可以实现需求,按以下步骤操作即可:

1. 扩展IdentityUser创建自定义用户类

// 自定义用户类,继承官方IdentityUser
public class ApplicationUser : IdentityUser
{
    // 新增需要的自定义字段
    public string FirstName { get; set; }
    public string LastName { get; set; }
    // 其他扩展字段可继续在此添加
}

2. 替换默认Identity配置

2.1 修改DbContext继承关系

将项目原有DbContext的父类替换为带自定义用户类的泛型版本:

public class AppDbContext : IdentityDbContext<ApplicationUser>
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {
    }
}

2.2 更新Program.cs服务注册

替换原有默认Identity注册逻辑,指定使用自定义的ApplicationUser:

// 替换原有AddIdentity相关配置
builder.Services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<AppDbContext>();

3. 生成迁移更新数据库结构

包管理器控制台执行命令:

  • 生成迁移文件:Add-Migration AddCustomUserFields
  • 应用迁移到数据库:Update-Database

如果使用.NET CLI,对应命令为:

  • dotnet ef migrations add AddCustomUserFields
  • dotnet ef database update

4. 补充字段赋值逻辑

修改注册页、用户信息编辑页的对应逻辑,在创建/更新用户时对自定义字段赋值即可,注册逻辑示例片段:

var user = new ApplicationUser
{
    UserName = Input.Email,
    Email = Input.Email,
    FirstName = Input.FirstName, // 自定义字段赋值
    LastName = Input.LastName // 自定义字段赋值
};
var result = await _userManager.CreateAsync(user, Input.Password);

5. 登录后获取自定义字段

两种常用实现方式可选:

方式1:将字段加入Claims(推荐,登录后直接读取无需查库)

自定义Claims工厂类,重写生成Claims的逻辑:

public class CustomUserClaimsFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
    public CustomUserClaimsFactory(UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor) 
        : base(userManager, optionsAccessor)
    {
    }

    protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
    {
        var identity = await base.GenerateClaimsAsync(user);
        // 把自定义字段加入Claims
        identity.AddClaim(new Claim("FirstName", user.FirstName ?? string.Empty));
        identity.AddClaim(new Claim("LastName", user.LastName ?? string.Empty));
        return identity;
    }
}

在Program.cs注册该工厂:

builder.Services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomUserClaimsFactory>();

Blazor组件读取示例:

@inject AuthenticationStateProvider AuthStateProvider

@code {
    private string _firstName;
    
    protected override async Task OnInitializedAsync()
    {
        var authState = await AuthStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;
        if (user.Identity.IsAuthenticated)
        {
            _firstName = user.FindFirstValue("FirstName");
        }
    }
}

方式2:直接通过UserManager查库读取

无需修改Claims配置,直接注入UserManager读取完整用户信息:

@inject UserManager<ApplicationUser> UserManager
@inject AuthenticationStateProvider AuthStateProvider

@code {
    private ApplicationUser _currentUser;
    
    protected override async Task OnInitializedAsync()
    {
        var authState = await AuthStateProvider.GetAuthenticationStateAsync();
        if (authState.User.Identity.IsAuthenticated)
        {
            _currentUser = await UserManager.GetUserAsync(authState.User);
            // 直接读取自定义字段
            var firstName = _currentUser.FirstName;
            var lastName = _currentUser.LastName;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:45:01