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 AddCustomUserFieldsdotnet 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
相关产品推荐
相关产品推荐

