如何自定义ASP.NET Identity Core用户名以允许特殊字符和空格

Bab*_*bar 4 c# identity asp.net-core

我已将注册操作方法更改为接受用户名而不是电子邮件。

if (ModelState.IsValid)
{
    var user = new ApplicationUser 
    {
        UserName = model.Name,
        Email = model.Email,
    };
Run Code Online (Sandbox Code Playgroud)

但是,当我像Joe Smith这样在TextBox中输入名称时,它给我一个错误,提示用户名无效。它不允许用户名接受空白。我的问题是如何修改内置用户名以允许空格和特殊字符。我正在使用ASP.NET Core。

提前致谢。

bsi*_*ma1 6

所以 cloudikka 的回答是对的。我将明确添加(cloudikka 的链接也对此进行了解释)您需要列出您想要允许的所有字符(不仅仅是空格或特殊字符),如下所示:

services.AddIdentity<ApplicationUser, IdentityRole>(options => {
    options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+/ ";
});
Run Code Online (Sandbox Code Playgroud)

而不是这options.User.AllowedUserNameCharacters = " ";意味着“只允许空白字符”。(我认为这是巴巴尔的问题。)


小智 6

如果您有一份详尽的特殊字符列表要列入白名单,那么建议的解决方案可能会很棘手。

如果您想改为黑名单,请在startup.cs中禁用白名单:

 services.AddIdentity<User, Role>(
                options =>
                {                        
                    options.User.AllowedUserNameCharacters = string.Empty;
                })
Run Code Online (Sandbox Code Playgroud)

然后创建您的自定义用户验证器

 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);
    }        
}
Run Code Online (Sandbox Code Playgroud)

然后将其添加到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>>()
Run Code Online (Sandbox Code Playgroud)


dro*_*der 5

您可以使用Startup.cs中的选项设置用户身份验证规则,以配置身份。

services.AddIdentity<ApplicationUser, IdentityRole>(options => {
    options.User.AllowedUserNameCharacters = "allowed characters here";
    options.User.RequireUniqueEmail = true/false;
});
Run Code Online (Sandbox Code Playgroud)

相关资源:

配置身份


IQt*_*eMC 5

services.AddIdentity<ApplicationUser, IdentityRole>(options => { options.User.AllowedUserNameCharacters = String.Empty; options.User.RequireUniqueEmail = true; })
            .AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)

  • 我发现我需要支持各种各样的字符,因为它们已经存在于客户安装中,所以这对我来说效果最好 - 它禁用了对用户名的检查。 (2认同)

小智 -3

用户名不应允许特殊字符或空格,我认为没有任何网站允许您这样做,您可以使用名字和姓氏来获取诸如“Joe Smith”之类的信息。