ASP.NET Core Identity でユーザー名を日本語対応させる


背景

ASP.NET Core Identity を使用するとユーザー認証が簡単にできる。
デフォルトではEmailとパスワードを登録するだけだった。
それにユーザー名を加えたところ日本語対応していなかった。。。

解決策

デフォルトで使用できる文字は以下の通り

options.User.AllowedUserNameCharacters =
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";

ユーザー名を日本語対応させるために Startup.cs 内で options.User.AllowedUserNameCharacters = null; に変更する。

Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    // .....
    services.Configure<IdentityOptions>(options =>
    {
        // User settings.
        options.User.AllowedUserNameCharacters = null; // null か "" で日本語にも対応する
    });
}

参考

ASP.NET Core Identity使い方

Visual Studioでwebアプリケーションを作成する際に認証を追加するだけ。

コンソールで以下のコマンド実行

PM> Update-Database

ビルドすると登録、ログイン画面が出来ている。

登録画面にユーザー名追加

プロジェクトで右クリック→追加→新規スキャフォールディングアイテムの追加→IDを追加
Account/Registerを選択して追加

Areas\Identity\Pages\Account\Register.cshtml にユーザー名入力フォームを追加

Register.cshtml
<div class="row">
    <div class="col-md-4">
        <form asp-route-returnUrl="@Model.ReturnUrl" method="post">
            <h4>Create a new account.</h4>
            <hr />
            <div asp-validation-summary="All" class="text-danger"></div>
            @*UserName入力*@
            <div class="form-group">
                <label asp-for="Input.UserName"></label>
                <input asp-for="Input.UserName" class="form-control" />
                <span asp-validation-for="Input.UserName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Input.Email"></label>
                <input asp-for="Input.Email" class="form-control" />
                <span asp-validation-for="Input.Email" class="text-danger"></span>
            </div>
            ...

Areas\Identity\Pages\Account\Register.cshtml.cs でユーザー名にはEmailが登録されていたので変更する。

Register.cshtml.cs

    public class RegisterModel : PageModel
    {
        //...
        public class InputModel
        {
            // UserName 追加
            [Required]
            [Display(Name = "UserName")]
            public string UserName { get; set; }

            [Required]
            [EmailAddress]
            [Display(Name = "Email")]
            public string Email { get; set; }
            //...
        }

        public async Task<IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
            if (ModelState.IsValid)
            {
                // UserName = Input.Email -> Input.UserName に変更
                var user = new IdentityUser { UserName = Input.UserName, Email = Input.Email };
                var result = await _userManager.CreateAsync(user, Input.Password);
                //...
            }
        }
    }