簡體   English   中英

如何自定義 ASP.NET Identity Core 用戶名以允許特殊字符和空格

[英]How to customize ASP.NET Identity Core Username to allow special characters and space

我已將注冊操作方法更改為接受用戶名而不是 Email。

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

但是當我像Joe Smith這樣在 TextBox 中輸入名稱時,它給了我一個錯誤,即Invalid UserName 它不允許用戶名接受空格。 我的問題是如何修改內置用戶名以允許空格和特殊字符。 我正在使用 ASP.NET 內核。

提前致謝。

您可以使用 Startup.cs 中的選項設置用戶驗證規則來配置身份。

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

相關資源:

配置身份

所以 cloudikka 的回答是對的。 我將明確添加(cloudikka 的鏈接也對此進行了解釋)您需要列出您想要允許的所有字符(不僅僅是空格或特殊字符),如下所示:

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>>()

這是大多數應用程序開發人員的 en-US 默認思維方式導致的問題之一。

我生成了一個小的 class 像這樣為我做這個......

options.User.AllowedUserNameCharacters =Utilities.GetAllWritableCharacters(encoding: System.Text.Encoding.UTF8);

助手 class 包含 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 = " ";

用戶名不應允許特殊字符或空格,我認為沒有任何網站允許您這樣做,您可以使用名字和姓氏來獲取諸如“Joe Smith”之類的信息。

正如@Jaffal 所提到的,用戶名不應允許特殊字符或空格。 它應該被視為唯一的用戶標識符(又名昵稱或電子郵件)。 為了得到很好地顯示的用戶名,您可能需要引入一個新屬性。

例如,添加一個名為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將始終與 Email 相同,另一個Name屬性將用於顯示目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM