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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:05:05