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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:22:15