Роли удостоверения 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");
            }
        }
Другие вопросы по тегам