AddToRoleAsync не может найти роль

У меня есть небольшое тестовое приложение, использующее Asp.net Core Identity. В автозапуске проверяю наличие определенных системных ролей:

if(await _roleManager.FindByNameAsync(“SYSADMIN”) == null)
{
  _context.Roles.Add(new IdentityRole(“SYSADMIN”));
  await _context.SaveChangesAsync();
}

Затем я проверяю и создаю учетную запись системного администратора, если она не существует:

var result = await _userManager.CreateAsync(adminUser, config["AdminPassword"]);

Затем я пытаюсь добавить этого пользователя в роль SYSADMIN:

if (result == IdentityResult.Success)
{                  
  await _userManager.AddToRoleAsync(adminUser, “SYSADMIN”);
}

но получаю ошибку, что роль не существует. Однако я вижу роль с указанным выше именем в AspNetRoles, и когда я запускаю приложение во второй раз, оно не переходит в раздел _context.Roles.Add(), поскольку _roleManager.FindByNameAsync возвращает роль.

Кто-нибудь видел такое поведение раньше или знает, что происходит, почему он не работает?

edit Я заметил, что NormalizedName имеет значение null, хотя в БД - это то, что он использует для сопоставления?


person LDJ    schedule 23.11.2016    source источник
comment
мне кажется, что вы непоследовательны и пытаетесь предварительно нормализовать имя роли. если IDPPlatform.System.Roles.OrgAdmin является строковой константой, которая нормализуется до SYSADMIN, вы должны просто использовать эту константу везде. такие методы, как _roleManager.FindByNameAsync, нормализуют его внутри метода, поэтому вам не нужно его предварительно нормализовать. то же самое с _userManager.AddToRoleAsync   -  person Joe Audette    schedule 23.11.2016
comment
Извините, это была ошибка копирования/вставки. Он разрешается в SYSADMIN, и константа действительно используется везде, я просто заменил ее в этом примере, чтобы показать, что она разрешила, поскольку это строка, которая помещается в столбец имени в SQL Server. Я заметил, что NormalizedName имеет значение null, хотя в БД - это то, что он использует для сопоставления?   -  person LDJ    schedule 24.11.2016


Ответы (1)


Так что это выглядит как ошибка для меня. Если вы используете конструктор, который принимает только строку, он заполняет имя, но не нормализованное имя. Может показаться, что нормализованное имя сопоставляется в AddToRoleAsync, поэтому оно никогда не будет работать.

Мне нужно было использовать следующее, чтобы принудительно заполнить NormalizedName:

_context.Roles.Add(new IdentityRole("SYSADMIN")
{
  NormalizedName = "SYSADMIN"
});

И он теперь работает. Я сообщу об ошибке команде, и, надеюсь, она будет исправлена.

person LDJ    schedule 24.11.2016
comment
У меня была такая же проблема. Спасибо за обходной путь. Наверное, именно так это и должно работать. - person abedon; 10.03.2017