Identity 2.1 - 检查现有角色,如果不是角色,则默认为基本用户

时间:2015-05-28 19:23:36

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

我在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”以及IF NOT,将其分配给用户。我不是最好的lambdas所以我敢肯定这可能是一个愚蠢的东西,但我无法弄清楚什么是错的!有人可以给我指导吗?

修改 澄清 - 这是管理员在系统中编辑其他人,而非他自己。

编辑2:此代码路径用于更新和注册新用户。以下建议允许保留现有用户,但新用户不会获得任何角色。抱歉不要以前更清楚。

2 个答案:

答案 0 :(得分:1)

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

// 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");    
}

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

修改

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

{{1}}

答案 1 :(得分:1)

我不确定您的问题中有哪些上下文。通常在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>(); }
}