ASP Identity Framework为AspNetUsers加自定义属性后IdentityUser未更新
解决方案
1. 修正Identity服务注册配置(最常见遗漏步骤)
默认Identity服务注册时使用原生IdentityUser类,你需要将Program.cs(.NET 6+)或Startup.cs中的服务注册逻辑替换为自定义的PublikoUser类:
// 错误的默认写法 builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<PublikoIdentityDbContext>(); // 正确的自定义写法 builder.Services.AddDefaultIdentity<PublikoUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<PublikoIdentityDbContext>();
2. 调整注册页的模型与处理逻辑
如果你已经将Identity页面 scaffold 到项目中,无需全量重新scaffold,直接修改Register相关文件即可:
- 给
Areas/Identity/Pages/Account/Register.cshtml.cs中的InputModel添加WebSiteName属性:
public class InputModel { // 原有属性:邮箱、密码、确认密码等保持不变 [Required] [Display(Name = "网站名称")] public string WebSiteName { get; set; } }
- 在
Register.cshtml页面添加对应的表单输入项:
<div class="form-floating mb-3"> <input asp-for="Input.WebSiteName" class="form-control" autocomplete="off" /> <label asp-for="Input.WebSiteName"></label> <span asp-validation-for="Input.WebSiteName" class="text-danger"></span> </div>
- 修改后端创建用户的逻辑,将输入值赋值给自定义用户对象:
// 错误的默认写法 var user = new IdentityUser { UserName = Input.Email, Email = Input.Email }; // 正确的自定义写法 var user = new PublikoUser { UserName = Input.Email, Email = Input.Email, WebSiteName = Input.WebSiteName // 赋值自定义属性 };
3. 关于是否需要重新执行Scaffold操作
- 如果你还没有将Identity页面 scaffold 到项目中,需要执行一次scaffold操作,选择
Account/Register页面,并且指定使用PublikoIdentityDbContext作为数据上下文 - 如果你已经 scaffold 过Identity页面,不需要重新执行全量scaffold,直接修改现有Register相关文件即可
额外检查项
- 所有用到
UserManager、SignInManager的位置,泛型参数要从IdentityUser替换为PublikoUser,例如声明为UserManager<PublikoUser> - 确认之前生成的迁移代码中确实包含了AspNetUsers表新增WebSiteName字段的逻辑,且数据库对应字段已经成功创建
内容的提问来源于stack exchange,提问作者Luca Prodan
相关产品推荐
相关产品推荐

