身份 2.1 - 检查现有角色,如果不在角色中则默认为基本用户
Identity 2.1 - Check for existing role, default to base user if not in role
我正在使用 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");
}
目标是让它检查用户是 "SuperAdmin" 还是 "ReadOnlyAdmin",如果不是,则将其分配给用户。我不是最擅长使用 lambda 的人,所以我确定这可能是愚蠢的,但我不知道出了什么问题!谁能给我指导?
编辑:
澄清 - 这是管理员在系统中编辑其他人,而不是他自己。
编辑 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");
}
我不确定你的问题 context 是什么。通常在 ASP.Net 身份中,你可以这样做 -
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>(); }
}
我正在使用 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");
}
目标是让它检查用户是 "SuperAdmin" 还是 "ReadOnlyAdmin",如果不是,则将其分配给用户。我不是最擅长使用 lambda 的人,所以我确定这可能是愚蠢的,但我不知道出了什么问题!谁能给我指导?
编辑: 澄清 - 这是管理员在系统中编辑其他人,而不是他自己。
编辑 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");
}
我不确定你的问题 context 是什么。通常在 ASP.Net 身份中,你可以这样做 -
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>(); }
}