IdentityUserでUserNameがUnique(C#, ASP)

C#

ASPのIdentityを利用していて、IdentityUserクラスのUserNameプロパティがUnique制約が付いてないにもかかわらず、重複値を入力できなかったため理由を調べてみました。

ソースは以下のValidateUserNameメソッドの部分が該当です。

var owner = await manager.FindByNameAsync(userName).ConfigureAwait(false);
if (
    owner != null &&
    !string.Equals(await manager.GetUserIdAsync(owner).ConfigureAwait(false), await manager.GetUserIdAsync(user).ConfigureAwait(false))
) {
    errors.Add(Describer.DuplicateUserName(userName));
}
aspnetcore/src/Identity/Extensions.Core/src/UserValidator.cs at 05b2afb73b55b11d8cb3691dedfebba1f0285332 · dotnet/aspnetcore
ASP.NETCoreisacross-platform.NETframeworkforbuildingmoderncloud-basedwebapplicationsonWindows,Mac,orLinux.-dotnet/aspnetcore

バリデーションロジックの中で
FindByNameAsyncで取れるUserIdと更新対象のUserIdのチェックを行っているからですね。
FindByNameAsync自体がUserNameでユーザを引っ張ってきているため、複数ヒットや別ユーザが取れてしまう場合にエラーとなり、結果的に重複入力がブロックされるようです。

なおDB的にはUnique制約は付いてませんので、DbContextなどから直接UserNameの値を弄れば重複した値を入力すること自体は可能です。その場合、Identityの流儀を外れることになりますので、NormalizedUserNameなどの内部で利用している値などは更新されず、あとで痛い目を見ることになると思います。(なりましたw)

コメント