public static ApplicationRole Create(string name, PermissionNames[] permissions = null, int?tenantId = null) { var r = new ApplicationRole { Name = name, NormalizedName = name.ToLower(), ConcurrencyStamp = Guid.NewGuid().ToString() }; if (permissions != null) { foreach (var permission in permissions.Distinct()) { r.Claims.Add(PermissionHelpers.CreateIdentityRoleClaim(permission)); } } if (tenantId != null) { r.TenantId = tenantId.Value; } return(r); }
public async Task <IActionResult> Edit(string id, [Bind(nameof(RoleDetailViewModel.Id), nameof(RoleDetailViewModel.SelectedPermissions), nameof(RoleDetailViewModel.RoleName), nameof(RoleDetailViewModel.InitialPermissionList))] RoleDetailViewModel m) { if (id == null) { return(NotFound()); } if (ModelState.IsValid) { var applicationRole = await Rdb.Roles.Include(lo => lo.Claims).SingleOrDefaultAsync(lo => lo.Id == id && lo.TenantId == TenantId); if (applicationRole == null) { return(NotFound()); } try { applicationRole.Name = m.RoleName; applicationRole.NormalizedName = m.RoleName.ToLower(); applicationRole.ConcurrencyStamp = Guid.NewGuid().ToString(); var selectedRoleClaims = new List <RoleClaim>(); foreach (var p in m.SelectedPermissions.ConvertAll(s => Parse.ParseEnum <PermissionNames>(s))) { selectedRoleClaims.Add(PermissionHelpers.CreateIdentityRoleClaim(p)); } foreach (var p in selectedRoleClaims) { if (applicationRole.Claims.All(x => x.ClaimType != p.ClaimType)) { applicationRole.Claims.Add(p); } } var rolesClaimsToRemove = applicationRole.Claims.Where(x => !selectedRoleClaims.Any(p2 => p2.ClaimType == x.ClaimType) && !ApiClaimTypes.Any(p3 => p3 == x.ClaimType)).ToList(); applicationRole.Claims.Remove(rolesClaimsToRemove); Rdb.Update(applicationRole); await Rdb.SaveChangesAsync(); SetToast(AspHelpers.ToastMessages.Saved); } catch (DbUpdateConcurrencyException) { if (!ApplicationRoleExists(applicationRole.Id)) { return(NotFound()); } else { throw; } } return(RedirectToIndex()); } return(View(m)); }