![](/img/trans.png)
[英]How to customize ASP.NET Identity Core Username to allow special characters and space while registering
[英]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
的新屬性,或者在其他一些實現中可能是兩個字段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 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.