我更改了我的注册操作方法接受用户名而不是电子邮件。
if (ModelState.IsValid)
{
var user = new ApplicationUser
{
UserName = model.Name,
Email = model.Email,
};
但是,当我在文本框中输入名称时,例如 Joe Smith 它给我一个错误,即无效的用户名。它不允许用户名接受空白空间。我的问题是如何修改内置用户名以允许空间和特殊字符。我正在使用ASP.NET核心。
预先感谢。
您可以将用户验证规则设置为使用startup.cs中的选项配置身份。
services.AddIdentity<ApplicationUser, IdentityRole>(options => {
options.User.AllowedUserNameCharacters = "allowed characters here";
options.User.RequireUniqueEmail = true/false;
});
相关资源:
配置身份
所以Cloudikka的答案正确。我将明确添加(Cloudikka的链接也解释了它),您需要列出您要允许的所有字符(不仅是whitespace或特殊字符),例如:
services.AddIdentity<ApplicationUser, IdentityRole>(options => {
options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+/ ";
});
而不是此 options.User.AllowedUserNameCharacters = " ";
,其意思是"只允许使用空间字符"。(我认为这是巴巴尔的问题。)
services.AddIdentity<ApplicationUser, IdentityRole>(options => { options.User.AllowedUserNameCharacters = String.Empty; options.User.RequireUniqueEmail = true; })
.AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
如果您对白名单的特殊字符列表详尽列表,则提出的解决方案可能很棘手。
如果要黑名单,请禁用startup.cs中的白名单:
services.AddIdentity<User, Role>(
options =>
{
options.User.AllowedUserNameCharacters = string.Empty;
})
然后创建自定义用户验证器
public class UsernameValidator<TUser> : IUserValidator<TUser>
where TUser : User
{
public Task<IdentityResult> ValidateAsync(UserManager<TUser> manager, TUser user)
{
if (user.UserName.Any(x=>x ==':' || x == ';' || x == ' ' || x == ','))
{
return Task.FromResult(IdentityResult.Failed(new IdentityError
{
Code = "InvalidCharactersUsername",
Description = "Username can not contain ':', ';', ' ' or ','"
}));
}
return Task.FromResult(IdentityResult.Success);
}
}
然后将其添加到startup.cs:
services.AddIdentity<User, Role>(
options =>
{
options.Password = new PasswordOptions
{
RequiredLength = 8,
RequireUppercase = true,
RequireNonAlphanumeric = true,
RequireDigit = true,
RequireLowercase = true
};
options.User.AllowedUserNameCharacters = string.Empty;
}).AddUserValidator<UsernameValidator<User>>()
这是大多数应用程序开发人员的默认心态引起的问题之一。
我生成了一个小班,为我这样做的小课...
options.User.AllowedUserNameCharacters =Utilities.GetAllWritableCharacters(encoding: System.Text.Encoding.UTF8);
助手类包含so
的getallWritableCharacters方法public class Utilities
{
public static string GetAllWritableCharacters(Encoding encoding)
{
encoding = Encoding.GetEncoding(encoding.WebName, new EncoderExceptionFallback(), new DecoderExceptionFallback());
var sb= new StringBuilder();
char[] chars = new char[1];
byte[] bytes = new byte[16];
for (int i = 20; i <= char.MaxValue; i++)
{
chars[0] = (char)i;
try
{
int count = encoding.GetBytes(chars, 0, 1, bytes, 0);
if (count != 0)
{
sb.Append(chars[0]);
}
}
catch
{
break;
}
}
return sb.ToString();
}
}
现在,您可以接受包括空格(包括空间)的角色集中的所有有意义的角色,并且"异国情调"信件
services.AddIdentity<AppUser, AppRole>(opts =>
{
opts.User.RequireUniqueEmail = true;
opts.User.AllowedUserNameCharacters =
"abcçdefgğhijklmnoöpqrsştuüvwxyzABCÇDEFGĞHIİJKLMNOÖPQRSŞTUÜVWXYZ0123456789-._";
opts.Password.RequiredLength = 4;
opts.Password.RequireNonAlphanumeric = false;
opts.Password.RequireLowercase = false;
opts.Password.RequireUppercase = false;
opts.Password.RequireDigit = false;
}).AddPasswordValidator<CustomPasswordValidator>().AddEntityFrameworkStores<AppIdentityDbContext>();
您基本上可以在两个引号之间输入您想要的任何字符。options.user.AllowEdusernamecharacters =&quot;&quot;
是的,用户名与电子邮件相同。电子邮件允许特殊字符,例如" "one_answers"/&quot.。因此,预计用户名中的特殊字符。
在此处讨论的电子邮件地址中的特殊字符:电子邮件地址中允许哪些字符?
@jaffal提到的用户名不得允许特殊字符或白色空间。它应被视为唯一的用户标识符(又称昵称或电子邮件)。为了完美显示的用户名,您可能需要引入一个新属性。
例如。添加一个称为Name
的新属性或在其他实现中,可能是两个字段GivenName
和FamilyName
。并要求用户填写她的名字到这些字段。
要使用额外字段扩展数据库,您的迁移可以是:
public partial class ApplicationUserNamePropertyAdded : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "Name",
table: "AspNetUsers",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Name",
table: "AspNetUsers");
}
}
使用ASP.NET身份类注册新用户时,您将拥有一个代码行,例如:
var user = new ApplicationUser { UserName = model.Email, Email = model.Email, Name = model.Name };
基本上,用户的UserName
始终与电子邮件相同,并且将使用另一个Name
属性来显示目的。
用户名不允许特殊字符或白色空间,我认为有任何网站可以允许您这样做,您可以使用firstName和姓氏来获取诸如此类的信息"乔·史密斯"。