4

我目前正在使用带有 CreateAsync(newRoleName) 方法的 RoleManager 将角色添加到我们的数据库中 - 这可以正常工作。但是当我尝试查询该角色时,它总是返回它不存在(即使我可以在数据库中看到它)。

谁能提供一些关于我为什么不能使用角色的见解?

        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] 不存在。

注意:我可以在 dbo.AspNetRoles 表中的数据库中看到角色“TestRole123”(或任何其他角色)的条目。

任何见解或帮助表示赞赏。

环境:Visual Studio 2017、Asp.NET Core、C#

4

2 回答 2

1

我不知道你是如何声明你的角色管理器的,但是下面的代码对我有用。它在 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");
            }
        }
于 2017-04-27T13:44:36.790 回答
1

我看到的问题之一 - 您需要await在方法前面使用关键字*Async()

var roleExists = await roleManager.RoleExistsAsync(role);

var roleCreated = await roleManager.CreateAsync(newRole);

等等。这将消除您的需要Thread.Sleep(500);- 很可能问题出在这条线上。

如果您不能执行异步方法,请使用方法的非异步版本:

var roleCreated = roleManager.Create(newRole);
于 2017-04-27T21:28:41.667 回答