How does ASP.NET Core Identity ensure username is unique under concurrent conditions?

47 views Asked by At

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?

0

There are 0 answers