Не удалось создать пользователя. Есть ли способ устранить ошибку?

Я использую ASP.NET Identity framework, с поставщиком EntityFramework (IdentityDbContext).

Я пытаюсь создать пользователя путем вызова UserManager.CreateAsync(..).

Возвращает объект типа IdentityResultсо следующими значениями:

{
   Succeeded: false,
   Errors: ["Name AndrewShepherd is already taken."]
}

Ошибка допустима-в базе данных действительно есть другой пользователь под названием «AndrewShepherd». Это не имя, выбранное пользователем; вместо этого я генерирую это имя из информации об учетной записи Outh2, предоставленной их учетной записью Google. (Учетные записи Google не применяют уникальные имена, только уникальные адреса электронной почты).

Поскольку проблема заключается в дублировании имени, я могу просто попытаться добавить номер к имени и попробовать еще раз. Я бы программно попытался создать AndrewShepherd_1, AndrewShepherd_2, AndrewShepherd_3 до тех пор, пока я не буду или успешным или получить другую ошибку.

Но как программно определить, что проблема состояла в дублировании имени?

Варианты:

  • Выполните сопоставление шаблона в строке ошибки. Это решение гарантированно сломается, когда следующая версия ASP.NET Identity имеет другой адрес сообщения об ошибках или мы интернационализируем веб-сайт.

  • Запустите проверку перед созданием пользователя. Я бы позвонилUserStore.FindByNameAsync, чтобы определить, если имя уже было принято до вызова UserManager.CreateASync(..). Это будет иметь небольшой риск параллелизма, если два разных сеанса пытаются добавить одно и то же имя пользователя в то же время.

Было бы намного проще, если бы мы могли просто выполнить проверку, как это:

if(identityResult.Errors.Where(e => e.ErrorCode == IdentityErrors.DuplicateName).Any())

Есть ли способ выполнить уникальную проверку пользователя, а затем добавить пользователя, который безопасен в параллельной среде?

1 ответ

  1. В качестве альтернативы вы можете проверить, существует ли имя пользователя в вашей БД. Если имя пользователя уже занято, можно изменить новое имя пользователя, например AndrewShepherd_1, AndrewShepherd_2, AndrewShepherd_3.

    using (YourProjectName.Models.DefaultConnection db = new Models.DefaultConnection ())
            {
                if (db.AspNetUsers.Select(q => q.UserName).Contains("usernameThatYouWantToCheck"))
                {
                    /*Your code*/
                }
            }