【问题标题】:Asp.NET Identity Roles not working when attempting to add Role to User尝试向用户添加角色时,Asp.NET 身份角色不起作用
【发布时间】:2017-09-25 08:02:53
【问题描述】:

我目前正在使用带有 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#

【问题讨论】:

    标签: c# asp.net asp.net-identity roles usermanager


    【解决方案1】:

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

    var roleExists = await roleManager.RoleExistsAsync(role);
    

    var roleCreated = await roleManager.CreateAsync(newRole);
    

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

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

    var roleCreated = roleManager.Create(newRole);
    

    【讨论】:

    • RoleManager 中似乎不存在非异步版本
    【解决方案2】:

    我不知道你是如何声明你的角色管理器的,但是下面的代码对我有用。它在 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");
                }
            }
    

    【讨论】:

    • 我想我现在看到了。 AddToRoleAsync,您使用整个用户,而不仅仅是 Id
    • 你上面提到的代码是在.net core还是.net full framework中完成的?您在 RoleManager 和 UserManager 上使用的方法似乎在 .net core 的实现中不可用。 UserManager 的 AddToRoleAsync() 方法在 .net 核心中的实现接受一个完整的 IdentityUser 而不仅仅是用户的 id。
    • 这不是核心,抱歉。但是核心不允许您根据需要在应用程序中添加包。也许您缺少一个包或更新一个包?
    猜你喜欢
    • 2014-08-08
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2017-05-16
    相关资源
    最近更新 更多