Entity framework Microsoft.AspNetCore.Identity.IdentityError:“;“无效用户名”;

Entity framework Microsoft.AspNetCore.Identity.IdentityError:“;“无效用户名”;,entity-framework,asp.net-core,entity-framework-core,Entity Framework,Asp.net Core,Entity Framework Core,我对用户模型进行了默认设置,只添加了两个自定义属性。EF创建了标准的表流 还有我的AspNetUsers表 如您所见,用户名可以为null 我的用户模型 public class User : IdentityUser { public string FullName { get; set; } public string CreateAt { get; set; } public User() { this.CreateAt = Conver

我对用户模型进行了默认设置,只添加了两个自定义属性。EF创建了标准的表流

还有我的AspNetUsers表

如您所见,用户名可以为null

我的用户模型

public class User : IdentityUser
{
    public string FullName { get; set; }
    public string CreateAt { get; set; }
    public User()
    {
        this.CreateAt = Convert.ToString(DateTime.Now);
    }
}
当我创建user时,我有一个exeption

但我没有对用户名进行任何验证或制定任何规则。 ApplicationDBContext的我的启动配置

services.AddIdentityCore<User>(opts =>
        {
            opts.Password.RequiredLength = 5;
            opts.Password.RequireNonAlphanumeric = false;
            opts.Password.RequireLowercase = true;
            opts.Password.RequireUppercase = true;
            opts.Password.RequireDigit = true; 
            opts.User.AllowedUserNameCharacters = null;
        }).AddRoles<IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDBContext>()
        .AddDefaultTokenProviders();
services.AddIdentityCore(选项=>
{
opts.Password.RequiredLength=5;
opts.Password.RequireNonAlphanumeric=false;
opts.Password.RequireLowercase=true;
opts.Password.RequireUppercase=true;
opts.Password.RequireDigit=true;
opts.User.AllowedUserNameCharacters=null;
}).AddRoles()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();

opts.User.AllowedUserNameCharacters=null没有帮助我。我做错了什么?

您试图将用户名设置为空字符串。查看Microsoft.AspNetCore.Identity的GitHub存储库中的,您似乎无法允许
null
或空字符串作为有效用户名。将
AllowedUserNameCharacters
设置为
null
仅意味着您没有检查白名单字符,这也是默认行为,但是
IsNullOrWhiteSpace
的预验证保持不变

检查来自官方存储库的此代码快照中的注释:

private async Task ValidateUserName(UserManager<TUser> manager, TUser user, ICollection<IdentityError> errors)
{
    var userName = await manager.GetUserNameAsync(user);
    if (string.IsNullOrWhiteSpace(userName)) // <-- There is no way around this.
    {
        errors.Add(Describer.InvalidUserName(userName));
    }
    else if (!string.IsNullOrEmpty(manager.Options.User.AllowedUserNameCharacters) &&
        userName.Any(c => !manager.Options.User.AllowedUserNameCharacters.Contains(c)))
    {
        errors.Add(Describer.InvalidUserName(userName));
    }
    else
    {
        var owner = await manager.FindByNameAsync(userName);
        if (owner != null &&
            !string.Equals(await manager.GetUserIdAsync(owner), await manager.GetUserIdAsync(user)))
        {
            errors.Add(Describer.DuplicateUserName(userName));
        }
    }
}
专用异步任务ValidateUserName(UserManager、TUser用户、ICollection错误)
{
var userName=await manager.GetUserNameAsync(用户);
if(string.IsNullOrWhiteSpace(userName))/!manager.Options.User.AllowedUserNameCharacters.Contains(c)))
{
添加(descripber.InvalidUserName(用户名));
}
其他的
{
var owner=await manager.FindByNameAsync(用户名);
如果(所有者)=null&&
!string.Equals(wait manager.GetUserIdAsync(所有者),wait manager.GetUserIdAsync(用户)))
{
添加(descripber.DuplicateUserName(用户名));
}
}
}