加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – ASP标识角色不存在错误

发布时间:2020-12-15 23:33:35 所属栏目:百科 来源:网络整理
导读:我正在尝试在我的MVC .NET CORE应用程序中创建一个页面,用户可以在其中更改其他用户的角色.此时视图和模型绑定都很有效,但是当实际尝试将角色保存回数据库时,我收到一条错误消息,指出角色不存在.我的方法是: 从模型中获取角色列表. 删除指定用户的现有角色.
我正在尝试在我的MVC .NET CORE应用程序中创建一个页面,用户可以在其中更改其他用户的角色.此时视图和模型绑定都很有效,但是当实际尝试将角色保存回数据库时,我收到一条错误消息,指出角色不存在.我的方法是:

>从模型中获取角色列表.
>删除指定用户的现有角色.
>使用模型中的列表添加角色.
>如果出现错误,请在事务中执行此操作.

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

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.MemberRoles为List< 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 ---

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

enter image description here

解决方法

当您尝试将用户添加到角色时,它首先尝试查找角色.在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() 
                        });
     }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读