I know ASP.NET Core Identity uses UserValidator to ensure the username is unique:
private async Task<List<IdentityError>?> ValidateUserName(UserManager<TUser> manager, TUser user)
{
List<IdentityError>? errors = null;
var userName = await manager.GetUserNameAsync(user).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(userName))
{
errors ??= new List<IdentityError>();
errors.Add(Describer.InvalidUserName(userName));
}
else if (!string.IsNullOrEmpty(manager.Options.User.AllowedUserNameCharacters) &&
userName.Any(c => !manager.Options.User.AllowedUserNameCharacters.Contains(c)))
{
errors ??= new List<IdentityError>();
errors.Add(Describer.InvalidUserName(userName));
}
else
{
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 ??= new List<IdentityError>();
errors.Add(Describer.DuplicateUserName(userName));
}
}
return errors;
}
If multiple requests come in at the same time, how does ASP.NET Core Identity handle synchronization?