【问题标题】:I cannot remove roles of user by using rolemanager我无法使用角色管理器删除用户角色
【发布时间】:2021-03-28 08:01:16
【问题描述】:

我尝试通过 UI 上的复选框为用户删除或添加角色,但出现了一些错误

await _userManager.IsInRoleAsync(user, roleName)

此代码总是返回 false,我无法检查。

var user = await _userManager.FindByIdAsync(id.ToString());
var roles = await _userManager.GetRolesAsync(user);

我仍然可以得到rolesuser。 谁能解释我收到此错误的原因?

private readonly UserManager<User> _userManager;
private readonly SignInManager<User> _signInManager;
private readonly RoleManager<Role> _roleManager;
private readonly IConfiguration _config;
private readonly IMapper _mapper;

public UserService(UserManager<User> userManager, 
    SignInManager<User> signInManager, RoleManager<Role> roleManager,
    IConfiguration config,
    IMapper mapper)
{
    _signInManager = signInManager;
    _userManager = userManager;
    _roleManager = roleManager;
    _config = config;
    _mapper = mapper;
}    
public async Task<ApiResult<bool>> RoleAssign(int id, RoleAssignRequest request)
{
    var user = await _userManager.FindByIdAsync(id.ToString());
    var roles = await _userManager.GetRolesAsync(user);
    var listRole = await _roleManager.RoleExistsAsync("admin");
    if (user == null)
    {
        return new ApiErrorResult<bool>("Tài khoản không tồn tại");
    }
    var removedRoles = request.Roles.Where(x => x.Selected == false).Select(x => x.Name).ToList();
    foreach (var roleName in removedRoles)
    {
        if (await _userManager.IsInRoleAsync(user, roleName) == true)
        {
            await _userManager.RemoveFromRoleAsync(user, roleName);
        }
    }
    await _userManager.RemoveFromRolesAsync(user, roles);
    
    var addedRoles = request.Roles.Where(x => x.Selected).Select(x => x.Name).ToList();
    foreach (var roleName in addedRoles)
    {
        if (await _userManager.IsInRoleAsync(user, roleName) == false)
        {
            await _userManager.AddToRoleAsync(user, roleName);
        }
    }
    
    return new ApiSuccessResult<bool>();
}

【问题讨论】:

  • 你检查了吗 await _userManager.RemoveFromRoleAsync(user, roleName);结果?
  • 是的,我已经检查过了,它返回了一个 IdentityResult :“UserNotInRole”

标签: c# asp.net asp.net-mvc asp.net-core asp.net-core-5.0


【解决方案1】:

当您尝试删除用户角色时:您可以这样做,我希望它会起作用。 它只是一个基本的例子。 删除角色代码:

 ApplicationUser user = UserManager.FindById(UserId.ToString());
            if (user != null)
            {
                foreach (var r  in user.Roles.ToList())
                {
                    user.Roles.Remove(r);
                }
            }

添加角色代码::

  IdentityUserRole userrole = new IdentityUserRole();
                           //add user information in userrole according to your buisness logic
                            user.Roles.Add(userrole);

【讨论】:

  • user 没有字段角色,我必须做什么@hemant
  • UserManager.GetRoles(userId.ToString());试试这个..
  • 是的,我可以按用户获取列表角色,但我不能使用 user.Roles.ToList();我不知道为什么
  • 用户角色属于 IdentityUser 类请检查 public virtual ICollection Roles { get; } 这个属性是否存在.. 以及检查继承 IdentityUser 类的 ApplicationUser 类..
  • 我的 applicationUser 已被继承 IdentityUser 类,我说我可以通过此代码获取角色 var roles = await _userManager.GetRolesAsync(user);
【解决方案2】:

查看UserManager.RemoveFromRoleAsync(TUser, String) 方法的源码可以发现,如果用户不在指定的角色中,会返回UserNotInRoleError。

public virtual async Task<IdentityResult> RemoveFromRoleAsync(TUser user, string role)
{
    ThrowIfDisposed();
    var userRoleStore = GetUserRoleStore();
    if (user == null)
    {
        throw new ArgumentNullException(nameof(user));
    }

    var normalizedRole = NormalizeName(role);
    if (!await userRoleStore.IsInRoleAsync(user, normalizedRole, CancellationToken))
    {
        return UserNotInRoleError(role);
    }
    await userRoleStore.RemoveFromRoleAsync(user, normalizedRole, CancellationToken);
    return await UpdateUserAsync(user);
}

要为指定用户添加/删除角色,您可以在添加/删除操作之前尝试检查角色是否存在并检查用户是否已经在角色中,如下所示。

将指定用户添加到命名角色

//add user to the named role

bool role_is_existing = await _roleManager.RoleExistsAsync(roleName);

//if the specified role name is not existing
//create the the specified role
if (!role_is_existing)
{
    var role = new IdentityRole();
    role.Name = roleName;
    await _roleManager.CreateAsync(role);
}

//check if the current user is a member of the given named role
var isInRole = await _userManager.IsInRoleAsync(user, roleName);

if (!isInRole)
{
    //add to role
    await _userManager.AddToRoleAsync(user, roleName);
}

从命名角色中删除指定用户

//check if the current user is a memeber of the given named role
var isInRole = await _userManager.IsInRoleAsync(user, roleName);

if (isInRole)
{
    await _userManager.RemoveFromRoleAsync(user, roleName);
}

当我从用户那里删除角色时,它会通知 UserNotInRole

请确保AspNetRoles表中的实际数据,并检查映射当前用户和指定角色的记录是否存储在AspNetUserRoles表中。

【讨论】:

  • 我按照你说的做了,但是只能添加不能删除。我还检查了 UserRoles 表中的记录,这些记录通过它们的 id 在 Roles 和 Users 表之间映射
  • 我的帖子有变量有以下值var user = a user有字段,var roles = "admin"var listRoles = true
  • 嗨@tunggggg,请检查您是否在AspNetRoles 表中为该角色存储了NormalizedName
  • 嗨@tunggggg,有什么更新吗?你查过角色记录的NormalizedName吗?
  • 谢谢,@Fei Han 我的问题解决了,以前我用的都是 5.0,我把 SDK 和 ef 降级到 .netcore3.1 和 ef 3.1.1 它工作,我不知道为什么但代码还是一样。
猜你喜欢
  • 2022-10-17
  • 2015-12-17
  • 1970-01-01
  • 2021-10-10
  • 2018-04-27
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多