【问题标题】:ASP Identity Role Does Not Exist ErrorASP 身份角色不存在错误
【发布时间】:2016-06-22 13:13:13
【问题描述】:

我正在尝试在我的 MVC .NET CORE 应用程序中创建一个页面,用户可以在其中更改其他用户的角色。此时,视图和模型绑定都工作得很好,但是当实际尝试将角色保存回数据库时,我收到一个错误,提示角色不存在。我的做法是这样的:

  1. 从模型中获取角色列表。
  2. 删除指定用户的现有角色。
  3. 使用模型中的列表重新添加角色。
  4. 如果出现错误,请在事务中执行所有操作。

我在控制器中的代码如下:

                var user = await _userManager.FindByIdAsync(id);

                if (user == null)
                {
                    return View("Error");
                }

                using (_context.Database.BeginTransaction())
                {
                    var removeResult = await _userManager.RemoveFromRolesAsync(user, await _userManager.GetRolesAsync(user));
                    if (!removeResult.Succeeded)
                    {
                        return View("Error");
                    }

                    var addResult = await _userManager.AddToRolesAsync(user, model.MemberRoles);
                    if (!addResult.Succeeded)
                    {
                        return View("Error");
                    }
                }

其中model.MemberRolesList<string> 的角色。奇怪的是,这个过程在_userManager.RemoveFromRolesAsync 上失败了,即使我将用户的现有角色直接传递到函数中。我曾尝试放弃 UserManager 课程并选择 ef 但没有运气。我还验证了模型中的角色与数据库中的角色匹配。有什么明显的错误会导致失败吗?谢谢。

编辑

这是我遇到的错误:

InvalidOperationException: Role ADMINISTRATOR does not exist.
Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4.<AddToRoleAsync>d__32.MoveNext()
--- End of stack trace from previous location where exception was thrown ---

以下是我的数据库中定义的角色:

【问题讨论】:

    标签: c# asp.net asp.net-mvc entity-framework .net-core


    【解决方案1】:

    当您尝试将用户添加到角色时,它首先会尝试查找该角色。在 Sql Profiler 中,您可以看到它实际上是通过 NormalizedName 字段而不是 Name 字段进行搜索。

    exec sp_executesql N'
    SELECT TOP(2) [r].[Id], [r].[ConcurrencyStamp], [r].[Name], [r].[NormalizedName]
    FROM [AspNetRoles] AS [r]
    WHERE [r].[NormalizedName] = @__normalizedRoleName_0',N'@__normalizedRoleName_0 nvarchar(256)',@__normalizedRoleName_0=N'ADMINISTRATOR'
    

    解决方法是在创建角色时将 NormalizedName 字段设置为 Name 字段的大写:

    所以在 SeedData 类中:

    /* Create Roles */
    IEnumerable<UserRole> allRoles = Enum.GetValues(typeof(UserRole)).Cast<UserRole>();
    
    
    foreach (UserRole role in allRoles)
    {
         if (!await roleManager.RoleExistsAsync(role.ToString()))
         {
                    await roleManager.CreateAsync(new IdentityRole { 
                              Name = role.ToString(), 
                              NormalizedName = role.ToString().ToUpper() 
                            });
         }
    }
    

    【讨论】:

    • 这也是我的问题。我对现有角色的解决方案是运行 sql UPDATE [Roles] SET NormalizedName = UPPER(Name)
    • roleManager 下出现红色波浪线
    • roleManager从何而来?
    【解决方案2】:

    我真的很惊讶你没有得到InvalidCastException,因为不可能直接将string[] 转换为List&lt;string&gt;。不太清楚你为什么首先这样做,因为如果你想要一个列表,你可以很容易地打电话给.ToList(),而不是.ToArray(),然后就这样吧。或者,由于GetRolesAsync 的返回类型是IList&lt;string&gt;,无论如何,你甚至不需要这样做。不过,现在,这是我在您的代码中看到的唯一问题。

    【讨论】:

    • 我想你是对的,这有点奇怪。我更新了我的帖子以反映这些更改,但我仍然看到该角色不存在。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2017-08-24
    • 2018-05-08
    • 2016-01-14
    • 2017-01-23
    • 1970-01-01
    • 2016-09-05
    • 2021-10-10
    相关资源
    最近更新 更多