如何自定义ASP.NET标识核心用户名以允许特殊字符和空格

时间:2017-12-27 07:18:56

标签: c# asp.net-core identity

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

if (ModelState.IsValid)
{
    var user = new ApplicationUser 
    {
        UserName = model.Name,
        Email = model.Email,
    };

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

先谢谢。

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

相关资源:

Configure Identity

答案 2 :(得分:0)

UserName不应该允许使用特殊字符或空格,我不认为有任何网站会允许您这样做,您可以使用FirstName和Last名称来获取“Joe Smith”之类的信息。

无论如何,您可以分享更多代码,例如您使用Identity和ApplicationUser类的方式,以便我们更好地为您提供帮助。

答案 3 :(得分:0)

如@Jaffal所述,UserName不应允许使用特殊字符或空格。它应被视为唯一的用户标识符(例如昵称或电子邮件)。 要获得良好显示的用户名,您可能需要引入新属性。

E.g。添加一个名为Name的新属性,或者在其他一些实现中添加两个字段GivenNameFamilyName。并要求用户在这些字段中填写她的名字。

要使用额外字段扩展数据库,您的迁移可以是:

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 Identity类注册新用户时的代码中,您将拥有如下代码行:

var user = new ApplicationUser { UserName = model.Email, Email = model.Email, Name = model.Name };

基本上,用户的UserName将始终与电子邮件相同,而另一个Name属性将用于显示目的。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

如果您要详尽列出特殊字符白名单,建议的解决方案可能会很棘手。

如果您想将其列入黑名单,请在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>>()