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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:30:03