C# & ASP.NET MVC:UserManager初始化用户时UserName与邮箱一致的问题
问题:指定的UserName被自动替换为邮箱,如何解决?
我编写了程序首次加载时初始化用户的代码:
public void Initialize() { if(!_roleManager.RoleExistsAsync(SD.Role_Admin).GetAwaiter().GetResult()) { _roleManager.CreateAsync(new IdentityRole(SD.Role_Admin)).GetAwaiter().GetResult(); _roleManager.CreateAsync(new IdentityRole(SD.Role_Employee)).GetAwaiter().GetResult(); _userManager.CreateAsync(new ApplicationUser { UserName = "AdminCore", Email = "adminCore@email.com", Name = "AdminName AdminSurename", PhoneNumber = "+133456789", StreetAddress = "test 123 ave", State = "IL", PostalCode = "PC23422", City = "Chicago", Country = "USA" }, "Admin123!").GetAwaiter().GetResult(); ApplicationUser user = _db.ApplicationUsers .FirstOrDefaultAsync(au=>au.Email == "adminCore@email.com") .GetAwaiter().GetResult(); _userManager.AddToRoleAsync(user, SD.Role_Admin) .GetAwaiter().GetResult(); } return; }
问题在于我指定UserName为"AdminCore",但用户创建完成后,UserName却与邮箱"adminCore@email.com"相同,请问如何解决该问题,使UserName与邮箱不相同?
解决方案
1. 排查ApplicationUser类的自定义逻辑
检查你的ApplicationUser类,确保没有在构造函数、属性setter或其他自定义逻辑中,将Email的值自动赋值给UserName。比如避免以下错误写法:
public class ApplicationUser : IdentityUser { public string Name { get; set; } // 其他自定义属性... // 错误示例:不要在构造函数里自动关联UserName和Email public ApplicationUser() { UserName = Email; } }
2. 检查Identity配置中的用户验证规则
在项目的配置文件(Program.cs或Startup.cs)中,确认没有配置强制UserName与Email绑定的规则。重点排查IdentityOptions的配置:
builder.Services.Configure<IdentityOptions>(options => { // 确保没有自定义的UserValidator强制UserName等于Email // 保留邮箱唯一的配置是没问题的: options.User.RequireUniqueEmail = true; });
3. 修复异步调用方式(避免同步阻塞导致的潜在问题)
你的代码使用GetAwaiter().GetResult()同步阻塞异步方法,可能引发意外的状态问题。改为异步方法实现,同时直接复用创建的用户对象,无需额外查询数据库:
public async Task InitializeAsync() { if (!await _roleManager.RoleExistsAsync(SD.Role_Admin)) { await _roleManager.CreateAsync(new IdentityRole(SD.Role_Admin)); await _roleManager.CreateAsync(new IdentityRole(SD.Role_Employee)); var adminUser = new ApplicationUser { UserName = "AdminCore", Email = "adminCore@email.com", Name = "AdminName AdminSurename", PhoneNumber = "+133456789", StreetAddress = "test 123 ave", State = "IL", PostalCode = "PC23422", City = "Chicago", Country = "USA" }; var createResult = await _userManager.CreateAsync(adminUser, "Admin123!"); if (createResult.Succeeded) { await _userManager.AddToRoleAsync(adminUser, SD.Role_Admin); } // 可选:处理用户创建失败的情况,输出错误信息 else { foreach (var error in createResult.Errors) { // 记录错误日志或输出 Console.WriteLine(error.Description); } } } }
4. 排查自定义UserStore或UserManager实现
如果项目中自定义了IUserStore<ApplicationUser>或UserManager<ApplicationUser>,检查其中的CreateAsync方法,确保没有将Email赋值给UserName的逻辑。
5. 清理已有测试用户
如果之前的初始化代码已经创建了错误的用户,先删除数据库中该用户记录,再重新运行初始化逻辑,避免旧数据干扰。
内容的提问来源于stack exchange,提问作者Modestas Vacerskas
相关产品推荐
相关产品推荐

