ASP.NET Core Identity 3.1:UserManager.RemoveFromRoleAsync 总是返回 UserNotInRole

Posted

技术标签:

【中文标题】ASP.NET Core Identity 3.1:UserManager.RemoveFromRoleAsync 总是返回 UserNotInRole【英文标题】:ASP.NET Core Identity 3.1: UserManager.RemoveFromRoleAsync always returns UserNotInRole 【发布时间】:2020-08-02 06:40:57 【问题描述】:

我能够使用角色管理器创建角色并使用 UserManager.AddToRoleAsync 将用户添加到角色 但是当使用 UserManager.RemoveFromRoleAsync(User, Role) 方法时,我总是收到错误提示 UserNotInRole

但是当使用 UserManager.GetUsersInRoleAsync("Administrator") 时,我得到了结果。

但是再次方法 UserManager.IsInRoleAsync(user, "Administrator"); 返回 false。

接下来,在检查 SQL 分析器时,我注意到在 UserInRole 表的 select 语句中为 userId 和 roleid 设置的参数是相反的

知道是什么导致了这种奇怪的行为吗?我正在使用 Identity.Core,版本=3.1.3.0

更新了代码 sn-p

我的 AspNetUserole 表

参考下图,只有 IsInRoleAsync 和 RemoveFromRoleAsync 方法获取失败,其他方法正在获取结果。

【问题讨论】:

向我们展示您的 AspNetUserRoles 表,并确认您来自 AddToRoleAsync 的管理员/用户正确获取用户。 @NanYu 我已经更新了详细信息。请告诉我这里缺少什么。 那么 AspNetUserRoles 有正确的用户和角色映射吗?如果创建一个新的角色和用户来测试,结果一样呢? 是的,新角色也有同样的问题。发现类似的问题报告了link,但在旧版本@NanYu 【参考方案1】:

您的身份 UserRole 表的密钥似乎配置错​​误。 可以把代码 sn-p 贴在你修改了 IdentityUserRole 表的地方吗?

【讨论】:

受保护的覆盖无效 OnModelCreating(ModelBuilder builder) base.OnModelCreating(builder); builder.ApplyConfiguration(new IdentityMigration()); builder.ApplyConfiguration(new RoleMigration()); //重命名表 builder.Entity>().ToTable("Rmit.UserRole").HasKey(k => new k.RoleId, k.UserId ); builder.Entity>().ToTable("Rmit.UserClaim"); @sthashakun 可以检查您的 userRole 键映射吗?从上图中关于 userId 和 roleid 列的参数,尝试更改为builder.Entity<IdentityUserRole<int>>().ToTable("Rmit.UserRole").HasKey(k => new k.UserId,k.RoleId ); 你是对的,它是导致问题的原因。非常感谢。

以上是关于ASP.NET Core Identity 3.1:UserManager.RemoveFromRoleAsync 总是返回 UserNotInRole的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 3.1 中基于角色的授权,带有 Identity 和 ExternalLogin

JWT 不记名令牌不适用于 ASP.Net Core 3.1 + Identity Server 4

如何使用 ASP.NET Core 3.1 将 Android 应用程序集成到 Identity Server 以进行身份​​验证?

asp.net core系列 48 Identity 身份模型自定义

Asp.net Core 2.0 Identity.TwoFactorRememberMe 到期

“Identity.External”的 ASP.NET Core 标识异常