我正在使用 ASP.NET Core Identity 2.0.2。当我调用
UserManager.RemoveFromRoleAsync
时,它不会删除用户的角色。它说:
Microsoft.AspNetCore.Identity.UserManager:警告:用户 b651a459-5d6b-4239-88e6-facb33f11e87 不属于管理员角色。
这是代码:
var userResult = await _userManager.RemoveFromRoleAsync(
user,
requestRole.ToReadableString());
我也尝试在
RemoveFromRolesAsync
函数中将角色作为数组传递,但没有成功。
我没有看到任何其他方法可以从用户中删除角色。
更新
var roleResult = await _userManager
.IsInRoleAsync(
user,
requestRole.ToReadableString());
var roleResult2 = await _userManager
.IsInRoleAsync(
user,
"Administrator");
var roles = await _userManager
.GetRolesAsync(user);
var userResult = await _userManager
.RemoveFromRoleAsync(
user,
requestRole.ToReadableString());
roleResult 和 roleResult2 都是 false。
角色包含“管理员”。
如果我使用该用户登录,则该用户具有“管理员”角色。
因此,授权属性表示用户具有此角色:
[Authorize(Roles = "Administrator", AuthenticationSchemes = "Bearer")]
另一个测试:
var roles = await _userManager
.GetRolesAsync(user);
foreach (string role in roles)
{
var roleTempResult = await _userManager
.IsInRoleAsync(
user,
role);
}
对于从 GetRolesAsync(user) 返回的所有角色,方法 IsInRoleAsync() 返回 false;
那里发生什么事了?
请
在“AspNetRoles”表中查找正确的角色名称
查看“AspNetUserRoles”表中的用户角色
在RemoveFromRoleAsync中指定“AspNetRoles”的角色名称
您必须在RemoveFromRoleAsync方法中使用“RoleName”而不是“RoleId”。
await _userManager.RemoveFromRoleAsync(user,"Administrator");
我也遇到了这个问题。
问题是我传递给所有这些函数的用户不是完整的 IdentityUser。它是 IdentityUser 的一个实例,具有正确的 Id、UserName 和 Email,但在早期过程中检索用户时,其他值(例如 NormalizedEmail、NormalizedUserName 和 PasswordHash)已被丢弃。
一旦我更改了检索过程以不转换从 GetUsersInRoleAsync 返回的用户(我一直在根据返回的用户使用新的 IdentityUser 实例填充列表,并且仅设置我需要的值。更改此设置以使用实际的 IdentityUser 实例填充列表)返回的用户修复了问题),IsInRoleAsync 和 RemoveFromRoleAsync 按预期工作。
我在使用 UserManager.RemoveFromRolesAsync(user, Roles) 提交应用程序定义的所有用户角色以进行删除时遇到了此问题。看起来,如果用户在所有提交的行中不具有成员资格(即缺少一个或多个行),则调用会失败。我采取了一种解决方法,以确保在添加一个或多个角色之前从数据库中删除所有目标用户角色。
// Delete all current user roles
var userRoles = await _context.UserRoles.Where(_ => _.UserId == appUser.Id).ToListAsync();
_context.RemoveRange(userRoles);
await _context.SaveChangesAsync();
// Add new roles
await _userManager.AddToRolesAsync(appUser, userProfile.Roles);