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

# 背景
ASP.NET Core Identity を使用するとユーザー認証が簡単にできる。
デフォルトではEmailとパスワードを登録するだけだった。
それにユーザー名を加えたところ日本語対応していなかった。。。
![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312111/b83fc90f-a37a-f987-c68a-acecef71d578.png)


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

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

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

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

## 参考

- https://docs.microsoft.com/ja-jp/aspnet/core/security/authentication/identity?view=aspnetcore-3.1&tabs=visual-studio
- https://stackoverflow.com/questions/42748332/where-are-the-allowonlyalphanumericusernames-and-uservalidator-properites-in-asp

## ASP.NET Core Identity使い方
Visual Studioでwebアプリケーションを作成する際に認証を追加するだけ。
<img width="482" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312111/85b11d3a-5421-7439-0ec4-6dc03a596c78.png">

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

```
PM> Update-Database
```

ビルドすると登録、ログイン画面が出来ている。
![register.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312111/5d65ec48-4e92-a5fd-ca02-980b9891c3fe.png)

## 登録画面にユーザー名追加
プロジェクトで右クリック→追加→新規スキャフォールディングアイテムの追加→IDを追加
Account/Registerを選択して追加
<img width="395" alt="id.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312111/bde08c04-f49b-7f25-44a6-e6411fa722aa.png">

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

```html: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が登録されていたので変更する。

```c#: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);
                //...
            }
        }
    }
```