ASP.NET Core 6 MVC中用UserManager创建用户遇InvalidUserName错误
解决ASP.NET Core Identity创建用户时出现"用户名无效"的错误
问题分析
你手动设置了UserName = "GoodName",但报错提示用户名是空格,说明实际传入Identity的UserName值为空字符串,而非你设置的内容。以下是几个常见的排查和解决方向:
1. 检查User类的定义
确保你的User类没有重复定义UserName属性,或者属性继承正确:
- 如果
User继承自IdentityUser(比如IdentityUser<int>),不要重复定义UserName,否则会覆盖基类的属性,导致Identity无法读取你设置的值。 - 错误示例:
public class User : IdentityUser<int> { public string Name { get; set; } // 重复定义会导致基类UserName未被赋值 public string UserName { get; set; } }
- 正确示例:
public class User : IdentityUser<int> { public string Name { get; set; } // 直接使用基类的UserName属性 }
2. 排查ApplicationUserClaimsPrincipalFactory的实现
检查你自定义的ApplicationUserClaimsPrincipalFactory,确认是否在创建ClaimsPrincipal时修改了User对象的UserName:
- 如果在
CreateAsync方法中意外清空或修改了UserName,会导致Identity验证时使用被修改后的值。 - 示例错误逻辑:
public override async Task<ClaimsPrincipal> CreateAsync(User user) { // 错误:清空了UserName user.UserName = string.Empty; var principal = await base.CreateAsync(user); return principal; }
- 移除这类修改
UserName的代码即可。
3. 确认调用CreateAsync前的UserName值
在调用await _userManager.CreateAsync(user, "123723-Aa");前添加断点,查看user.UserName的实际值:
- 如果此时
UserName已经是空字符串,说明在你手动赋值后,有其他代码修改了这个属性,比如模型验证、自定义中间件或其他业务逻辑。
4. 检查Identity配置是否被覆盖
确认在Program.cs中配置AddIdentity后,没有其他代码修改options.User.AllowedUserNameCharacters或重置Identity配置,导致允许的字符规则被还原为默认(默认不允许-._@+等字符,但你的错误是用户名为空,所以这个可能性较低,但可以排查)。
额外建议
如果以上排查都没问题,你可以尝试简化代码测试:
- 暂时移除
AddClaimsPrincipalFactory<ApplicationUserClaimsPrincipalFactory>(),使用默认的工厂,看是否还会出现错误,以此判断是否是自定义工厂的问题。 - 直接使用
IdentityUser而非自定义的User类进行测试,确认是否是自定义User类的问题。
内容的提问来源于stack exchange,提问作者MrMustafa022
相关产品推荐
相关产品推荐

