【问题标题】:Identity 2.1 - Check for existing role, default to base user if not in roleIdentity 2.1 - 检查现有角色,如果不在角色中,则默认为基本用户
【发布时间】:2015-05-29 05:33:41
【问题描述】:

我正在使用 c#、MVC 和 ASP.NET Identity 中的此控制器代码:

var role = (from r in context.Roles where r.Name.Contains("SuperAdmin") || r.Name.Contains("ReadOnlyAdmin") select r).FirstOrDefault();
var roleusers = context.Users.Where(x => x.Roles.Select(y => y.RoleId).Contains(role.Id)).ToList();

                if (roleusers.Find(x => x.Id.Equals(userDetails.Id)) != null)
                {
                    await UserManager.AddToRoleAsync(userDetails.Id, "User");    
                }

目标是让它检查用户是“SuperAdmin”还是“ReadOnlyAdmin”,如果不是,则将其分配给用户。我不是 lambdas 最棒的,所以我敢肯定这可能是愚蠢的,但我不知道出了什么问题!谁能给我指导?

编辑: 澄清 - 这是管理员编辑系统中的其他人,而不是他自己。

编辑 2: 此代码路径用于更新和注册新用户。以下建议允许保留现有用户,但新用户没有角色。很抱歉之前没有更清楚地说明这一点。

【问题讨论】:

    标签: c# asp.net asp.net-identity


    【解决方案1】:

    我不确定您的问题中的 context 是什么。通常在 ASP.Net Identity 中,您可以这样做 -

    string userId = userDetails.Id;
    IList<string> assingedRoles = await UserManager.GetRolesAsync(userId);
    if (!assingedRoles.Contains("SuperAdmin") && 
        !assingedRoles.Contains("ReadOnlyAdmin"))
    {
        await UserManager.AddToRoleAsync(userId, "User");
    }
    
    // UserManager
    private AppUserManager UserManager
    {
        get { return HttpContext.GetOwinContext().GetUserManager<AppUserManager>(); }
    }
    

    【讨论】:

    • 我很抱歉-这种情况下的上下文是身份上下文,像您的代码示例一样实例化。这可行,但是当新用户创建点击此代码块时,他们不会被分配任何角色。我将该语句转换为 OR 只是为了查看它是否有效并且给出了相同的结果。
    • 添加角色后需要拨打UserManager.UpdateAsync(appUser);
    • 这就是解决方案——我的第二个问题是一个单独的威胁在旁边出现并在方法完成比较和更新用户之前崩溃了。感谢您的帮助!
    【解决方案2】:

    如果我的理解正确,我相信您只需要以下内容:

    if (!HttpContext.User.IsInRole("SuperAdmin") || HttpContext.User.IsInRole("ReadOnlyAdmin"))
    {
        await UserManager.AddToRoleAsync(userDetails.Id, "User");
    }
    

    如果用户不是“SuperAdmin”或“ReadOnlyAdmin”角色,请将其添加到角色“User”。

    编辑

    好的,在这种情况下,试试这样的。

    // get SuperAdmin role
    var superAdmin = (from r in context.Roles where r.Name.Contains("SuperAdmin") select r).FirstOrDefault();
    
    // get ReadOnlyAdmin role
    var readOnlyAdmin = (from r in context.Roles where r.Name.Contains("ReadOnlyAdmin") select r).FirstOrDefault();
    
    // get users in either role
    var roleusers = context.Users.Where(x => x.Roles.Select(y => y.RoleId).Contains(superAdmin.Id) || x.Roles.Select(z => z.RoleId).Contains(readOnlyAdmin.Id)).ToList();
    
    // if the user doesn't exist in roleusers
    if (roleusers.Find(x => x.Id.Equals(userDetails.Id)) == null)
    {
        await UserManager.AddToRoleAsync(userDetails.Id, "User");    
    }
    

    【讨论】:

    • 与此类似,但在我的情况下,您正在修改与您自己不同的用户。
    • 抱歉,我不确定我是否完全理解您的评论。此代码将检查触发操作的用户角色,如果他们不属于任一管理员角色,则为其分配角色“用户”。这不是你想要的吗?
    • 不,这是管理员在编辑与他自己不同的用户。例如,约翰正在编辑苏。您建议的代码可用于编辑 John,但如果您以 John 身份登录,则无法编辑 Sue。
    • @Dreamcasting,请查看我的编辑,让我知道这是否适合您。
    • 是否已经创建了“用户”角色?它必须已经存在于 AspNetRoles 表中才能正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多