ASP.NET Core Identity注册报错:用户名无效,仅允许字母或数字
问题分析与解决方案
报错的核心原因是创建ApplicationUser实例时未赋值UserName属性,ASP.NET Core Identity默认要求UserName不能为空且符合字符规则,你仅设置了Name和Email,导致UserName为空,触发了该错误。以下是具体修复步骤:
1. 修正ApplicationUser实体类
IdentityUser已内置Email、UserName等核心属性,重复定义Email、Password、ConfirmPassword会引发冲突,且密码相关字段属于视图模型范畴,不应放在实体类中:
using Microsoft.AspNetCore.Identity; namespace SLE_System.Data { public class ApplicationUser : IdentityUser { // 仅保留自定义的Name字段 public string Name { get; set; } } }
2. 完善注册控制器的用户创建逻辑
创建用户时必须赋值UserName,可根据业务需求选择用Email或Name填充:
[HttpPost] public async Task<IActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser { Name = model.Name, Email = model.Email, // 关键:赋值UserName,示例用Email填充,也可改为model.Name UserName = model.Email }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction("index", "Home"); } foreach (var error in result.Errors) { ModelState.AddModelError("", error.Description); } // 移除重复的错误提示,避免混淆 // ModelState.AddModelError(string.Empty, "Invalid Login Attempt"); } return View(model); }
3. 补全IdentityOptions配置
你之前的配置代码缺少闭合大括号,修正后确保字符规则生效:
services.Configure<IdentityOptions>(options => { options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+"; // 若需用Email作为唯一标识,开启以下配置 options.User.RequireUniqueEmail = true; });
额外操作
- 确保
RegisterViewModel包含Name、Email、Password、ConfirmPassword字段,并添加[Required]、[EmailAddress]等验证特性,完善前端校验。 - 执行数据库迁移:运行
Add-Migration和Update-Database命令,同步实体类修改到数据库。
内容的提问来源于stack exchange,提问作者Rob644
相关产品推荐
相关产品推荐

