public async Task<IActionResult> ManageUsers(IEnumerable<string> AdminUsers) { var adminRole = Context.Roles.FirstOrDefault(Role => Role.Name == "Admin"); if (adminRole == null) { throw new InvalidDataException("Admin role not found"); } // Remove users that are no longer admin var oldAdminsToDelete = (from User in Context.Users join UserRole in Context.UserRoles on User.Id equals UserRole.UserId join Role in Context.Roles on UserRole.RoleId equals Role.Id where Role.Name == adminRole.Name && !AdminUsers.Contains(User.Email) select new {User, UserRole, Role}).ToList(); foreach (var user in oldAdminsToDelete) { await UserManager.RemoveFromRoleAsync(user.User, adminRole.Name); } // Add new admin users var newAdminsToAdd = (from User in Context.Users where Context.UserRoles.Count(UserRole => UserRole.UserId == User.Id && UserRole.RoleId == adminRole.Id) == 0 // As of 04.01.2016, the EF7 RC1 does translate an errorenous SQL when using .Any() in a sub query here, need to fall back to "Count() == 0" && AdminUsers.Contains(User.Email) select User).ToList(); foreach (var user in newAdminsToAdd) { await UserManager.AddToRoleAsync(user, adminRole.Name); } ViewBag.SuccessMessage = "Updated users."; var model = new ManageUsersViewModel(); model.Users = Context.Users.Select(WebsiteUser => new UserAdminRoleViewModel { Name = WebsiteUser.Email, IsAdmin = WebsiteUser.Roles.Any(Role => Role.RoleId == adminRole.Id)}); return View(model); }
public IActionResult ManageUsers() { var adminRoleId = Context.Roles.FirstOrDefault(Role => Role.Name == "Admin").Id; var model = new ManageUsersViewModel(); model.Users = Context.Users.Select(User => new UserAdminRoleViewModel { Name = User.Email, IsAdmin = User.Roles.Any(Role => Role.RoleId == adminRoleId)}); return View(model); }