Роли удостоверения Asp.NET не работают при попытке добавить роль пользователю
В настоящее время я добавляю роли в нашу базу данных, используя RoleManager с методом CreateAsync (newRoleName), который работает правильно. Но когда я пытаюсь запросить эту роль, она всегда возвращает ее к себе, даже если я вижу ее в базе данных.
Кто-нибудь может дать некоторое представление о том, почему я не могу использовать эту роль?
var roleExists = roleManager.RoleExistsAsync(role);
if (!roleExists.Result)
{
var newRole = new IdentityRole(role)
{
Name = role,
NormalizedName = role.ToUpper(),
};
var roleCreated = roleManager.CreateAsync(newRole);
Thread.Sleep(500); // Used to get result back first.
var roleExistsYet = roleManager.RoleExistsAsync(role);
if (!roleExists.Result)
{
// ALWAYS Returns [False]
}
}
Первоначальная проблема возникла, когда мы создавали нового пользователя с помощью UserManager, и следующий метод привел бы к ошибке
var roleAddResult = userManager.AddToRoleAsync(newUser, "TestRole123");
Ошибка исключения: роль [TESTROLE123] не существует.
Примечание. Я вижу запись для роли "TestRole123" (или любой другой роли) в базе данных в таблице dbo.AspNetRoles.
Любое понимание или помощь приветствуется.
Среда: Visual Studio 2017, Asp.NET Core, C#
2 ответа
Одна из проблем, которую я вижу - вам нужно использовать ключевое слово await
перед *Async()
методы:
var roleExists = await roleManager.RoleExistsAsync(role);
а также
var roleCreated = await roleManager.CreateAsync(newRole);
и т.д. Это избавит вас от необходимости делать Thread.Sleep(500);
- Скорее всего, проблема с этой линией.
Если вы не можете использовать асинхронные методы, используйте не асинхронные версии методов:
var roleCreated = roleManager.Create(newRole);
Я не знаю, как вы объявили свой ролевой менеджер, но следующий код работает для меня. Он настраивается в файле startup.cs и автоматически создает суперпользователя, если роли не были созданы. Возможно, это может помочь вам?
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
if (!roleManager.RoleExists("SuperUser"))
{
roleManager.Create(new IdentityRole("SuperUser"));
//superuser
var user = new ApplicationUser
{
UserName = " Name",
Email = "Email",
Firstname = "Firstname",
Lastname = "Lastname"
};
var pass = "AwesomePasswordOverHere";
var chkUser = await userManager.CreateAsync(user, pass);
//make superuser
if (chkUser.Succeeded)
{
await userManager.AddToRoleAsync(user.Id, "SuperUser");
}
}