Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 标识2.1-检查现有角色,如果不在角色中,则默认为基本用户_C#_Asp.net_Asp.net Identity - Fatal编程技术网

C# 标识2.1-检查现有角色,如果不在角色中,则默认为基本用户

C# 标识2.1-检查现有角色,如果不在角色中,则默认为基本用户,c#,asp.net,asp.net-identity,C#,Asp.net,Asp.net Identity,我正在使用c#、MVC和ASP.NET标识中的控制器代码: 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).Contain

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

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");    
                }
目标是让它检查用户是“超级管理员”还是“ReadOnlyAdmin”,如果不是,则将其分配给用户。我不是lambdas最棒的,所以我肯定这可能是件愚蠢的事情,但我不知道是什么错了!有人能给我指导吗

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


编辑2:此代码路径用于更新和注册新用户。下面的建议允许保留现有用户,但新用户没有角色。抱歉之前没有说得更清楚。

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

if (!HttpContext.User.IsInRole("SuperAdmin") || HttpContext.User.IsInRole("ReadOnlyAdmin"))
{
    await UserManager.AddToRoleAsync(userDetails.Id, "User");
}
如果用户不是“超级管理员”或“ReadOnlyAdmin”角色,请将其添加到角色“用户”中

编辑 好吧,那样的话,试试这样

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

我不确定你的问题中的背景是什么。通常在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>(); }
}
stringuserid=userDetails.Id;
IList assingedRoles=await UserManager.GetRolesAsync(userId);
如果(!assingedRoles.包含(“超级管理员”)&&
!assingedRoles.Contains(“ReadOnlyAdmin”))
{
wait UserManager.AddToRoleAsync(userId,“User”);
}
//用户管理器
专用AppUserManager用户管理器
{
获取{return HttpContext.GetOwinContext().GetUserManager();}
}

与此类似,但在我的情况下,您修改的用户与您自己不同。对不起,我不确定我是否完全理解您的评论。此代码将检查触发操作的用户角色,如果他们不在任一管理员角色中,则为他们分配角色“user”。这不是你想要的吗?不,这是一个管理员正在编辑一个不同于他自己的用户。例如,约翰正在编辑苏。您建议的代码适用于编辑John,但如果您以John的身份登录,则不会编辑Sue。@Dreamcasting,请查看我的编辑,并告诉我这是否适用于您。“用户”角色是否已创建?它必须已经存在于AspNetRoles表中才能工作。很抱歉,本例中的上下文是标识上下文,就像您的代码示例一样实例化。这是可行的,但是当一个新的用户创建点击这个代码块时,他们不会被分配任何角色。我将语句转换为OR,只是为了看看它是否有效,它给出了相同的结果在您添加到角色后。这是解决方案-我的第二个问题是一个单独的威胁在它完成此比较和更新用户之前出现,并使方法崩溃。谢谢你的帮助!