.NET Core 2.0调用AddToRoleAsync报错:用户名无效,仅允许字母或数字
解决.NET Core 2.0 Identity添加角色时报错"User name is invalid, can only contain letters or digits"
这个问题的根源很明确:你把邮箱地址设为了用户名,但.NET Core Identity的默认用户名验证规则只允许字母和数字,而邮箱里包含的@、.等字符不在允许范围内,所以调用AddToRoleAsync时,UserManager会自动校验用户对象的合法性,触发这个错误。
下面是具体的解决步骤:
1. 修改Identity配置,扩展允许的用户名字符
在Startup.cs的ConfigureServices方法中,添加Identity选项配置,把邮箱需要的特殊字符(比如@、.、_)加入到允许的用户名字符列表中:
services.AddDefaultIdentity<ApplicationUser>(options => { // 扩展允许的用户名字符,兼容邮箱格式 options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@._-"; }) .AddRoles<IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>();
2. 确认用户对象的UserName字段合法性
确保传入AddToRoleAsync的applicationUser对象的UserName属性确实是标准邮箱格式,没有包含其他不在允许列表里的特殊字符。
补充:为什么Startup中操作角色没问题?
你在Startup的Configure方法中创建角色并给管理员赋值时,可能是直接创建了纯字母数字的用户名(符合默认规则),或者当时的操作没有触发严格的用户名校验逻辑;而后续Controller中处理的用户是用邮箱作为用户名的,刚好触发了默认的验证限制。
修改完配置后,Identity就会认可邮箱格式的用户名,AddToRoleAsync也就不会再抛出这个验证错误了。
内容的提问来源于stack exchange,提问作者user6383418
相关产品推荐
相关产品推荐

