控制Identity 2.0, UserManager.AddToRoles()行为

本文关键字:AddToRoles 行为 UserManager Identity 控制 | 更新日期: 2023-09-27 18:10:07

我有一个MVC c#应用程序使用Identity 2.0。在表单上,我有一个要分配给用户的角色的多选择列表。在控制器中,我调用

               IdentityResult rc = await userManager.AddToRolesAsync(roleViewModel.UserId, roleViewModel.AssignedRoles);

(roleViewModel的地方。UserId是GUID, roleViewModel。AssignedRoles是一个字符串[]。

问题是,如果用户已经被分配给一个角色,则操作失败,提示"user already in role"。我可以在尝试AddToRole(单数)之前遍历数组并查询用户是否已经在角色中,但我认为AddToRole(复数)将允许我指定是否忽略现有的成员(我当然没有在在线文档中看到任何内容)。

所以,我的问题是……我想错了吗?AddToRole(复数)主要用于创建操作,我必须迭代/AddToRole(单数)进行编辑/更新?还是有更好的办法?

编辑1:

这个主意怎么样?

    IEnumerable<string> rolesToAdd = roleViewModel.AssignedRoles.Except(userManager.GetRoles(roleViewModel.UserId));
    IEnumerable<string> rolesToRemove = userManager.GetRoles(roleViewModel.UserId).Except(roleViewModel.AssignedRoles);
    IdentityResult rcRemove = await userManager.RemoveFromRolesAsync(roleViewModel.UserId, rolesToRemove.ToArray());
    IdentityResult rcAdd = await userManager.AddToRolesAsync(roleViewModel.UserId, rolesToAdd.ToArray());
if (!rcAdd.Succeeded || !rcRemove.Succeeded) { ... }

(是的,我知道我可以把它改写成两行,我这样写是为了清楚。)

控制Identity 2.0, UserManager.AddToRoles()行为

文档在这个主题上相当肤浅:

https://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.usermanagerextensions.addtoroles (v = vs.108) . aspx # M: Microsoft.AspNet.Identity.UserManagerExtensions.AddToRoles

您可以编写自己的(扩展)方法来为您完成这项工作。对请求进行批处理,并将AddToRole的使用与之前对已经在组中的用户的检查结合起来。这不是一个很好的方法,但一个可能的解决方案。