从ASP.NET Identity 2.x中的角色中删除用户

时间:2015-01-20 23:25:32

标签: asp.net-mvc asp.net-identity asp.net-identity-2

如何从ASP.NET Identity 2.x中的角色中删除用户? 关于向用户添加角色没有问题,但是当我想从用户中删除角色时我无法解决。应该提到没有异常或错误!

//POST: Admin/User/Edit/5
    [AcceptVerbs(HttpVerbs.Post)]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Edit([Bind(Prefix = "")]UserViewModel userViewModel, List<int> availableRoles)
    {
        if (ModelState.IsValid)
        {
            List<int> newListOfRolesIDs = availableRoles;
            List<int> oldListOfRolesIDs = UserBLL.Instance.GetRolesIDs(userViewModel.Id);
            List<int> deletedList;
            List<int> addedList;
            var haschanged = oldListOfRolesIDs.ChangeTracking(newListOfRolesIDs, out deletedList, out addedList);
            using (new EFUnitOfWorkFactory().Create())
            {
                if (haschanged)
                {
                    UserBLL.Instance.InsertRoles(addedList, userViewModel.Id);
                    UserBLL.Instance.DeleteRoles(deletedList, userViewModel.Id);
                }
                await UserBLL.Instance.UpdateAsync(userViewModel);
            }
            //ArticleBLL.Instance.UpdatePartial(articleViewModel,  m => m.Title);
            return RedirectToAction("Edit");
        }
        return View(userViewModel);
    }

删除角色方法:

public void DeleteRoles(List<int> deleteList, int? userId)
    {
        if (userId != null)
        {
            User user = UserManager.FindByIdAsync(userId.Value).Result;
            foreach (var i in deleteList)
            {
                user.Roles.Remove(new UserRole { RoleId = i, UserId = user.Id }); // What's the problem?!
            }
        }
    }

插入角色方法:

public void InsertRoles(List<int> insertList, int? userId)
    {
        if (userId != null)
        {
            User user = UserManager.FindByIdAsync(userId.Value).Result;
            foreach (var i in insertList)
            {
                user.Roles.Add(new UserRole { RoleId = i, UserId = user.Id });
            }
        }
    }

3 个答案:

答案 0 :(得分:9)

您正在寻找的是RemoveFromRoleAsync方法。示例将类似于以下内容:

public async Task DeleteRolesAsync(List<string> deleteList, int? userId)
{
    if (userId != null)
    {
        foreach (var roleName in deleteList)
        {
            IdentityResult deletionResult = await UserManager.RemoveFromRoleAsync(userId, roleName);
        }
    }
}

如果您已拥有该用户的ID,则无需再次获取该用户(仅当您要确保该用户确实存在时;然后您必须使用if语句包装您的foreach)。删除方法需要角色的名称而不是ID来从角色中删除用户。您可以使用操作的结果(在我的示例中存储在 deletionResult 中)以确保操作成功。请记住,用户管理器的名称(在我的示例中为 UserManager )可能会因您的实现而有所不同。

答案 1 :(得分:3)

我有同样的问题,我最终使用的是 RemoveFromRolesAsync(string userId,params string [] roles)方法 来自UserManager。

在数组中使用角色名称有效。 但是有一个问题是,如果用户不在数组中的某个角色中,则不会从数组中的任何角色中删除用户。 全有或全无。

            var usr = UserManager.FindById(usrV.ID.ToString());

            string[] deleteList;
            deleteList= new string[1];
            deleteList[0] = "Engineer";

            var rresult1 = UserManager.RemoveFromRolesAsync(usr.Id, deleteList);

希望有所帮助

答案 2 :(得分:0)

您可能想查看此博文。 ASP.NET团队有一个示例,其中包括添加和删除用户的角色。

ASP.NET Identity 2.0: Customizing Users and Roles