/// <summary> /// 更新声明 /// </summary> /// <param name="identityRole"></param> /// <param name="claimValues"></param> /// <param name="claimType"></param> /// <returns></returns> private async Task UpdateRoleClaimAsync(BaseIdentityRole identityRole, string[] claimValues, string claimType) { // 取得全部声明 var claims = await _roleManager.GetClaimsAsync(identityRole); // 找出当前类型的声明 var elementClaims = claims.Where(c => c.Type == claimType); // 找到需要删除的声明 var deleteClaims = elementClaims.Where(e => !claimValues.Contains(e.Value)); // 找到需要添加声明的值 var addClaimValues = claimValues.Where(e => !elementClaims.Select(c => c.Value).Contains(e)); // 执行操作 foreach (var claim in deleteClaims) { await _roleManager.RemoveClaimAsync(identityRole, claim); } foreach (var value in addClaimValues) { await _roleManager.AddClaimAsync(identityRole, new Claim(claimType, value)); } // 清理当前角色的权限缓存 _permissionCacheService.ClearRoleClaimCache(identityRole.Name); }
/// <summary> /// 添加角色 /// </summary> /// <param name="role">角色</param> public async Task <bool> AddRoleAsync(RoleDetail role) { var identityRole = new BaseIdentityRole { Name = role.Name, Describe = role.Describe }; // 保存角色 var result = await _roleManager.CreateAsync(identityRole); if (result.Succeeded) { // 保存关联页面元素 if (role.Elements != null) { var elements = new List <string>(); foreach (var element in role.Elements) { // 找到所有的父元素 var ancestorElements = _elementTreeRepository.GetByWhereNoTracking(e => e.Descendant == Guid.Parse(element)); elements.AddRange(ancestorElements.Select(e => e.Ancestor.ToString())); // 找到所有的子元素 var descendantElemnts = _elementTreeRepository.GetByWhereNoTracking(e => e.Ancestor == Guid.Parse(element)); elements.AddRange(descendantElemnts.Select(e => e.Descendant.ToString())); } elements = elements.Distinct().ToList(); await UpdateRoleClaimAsync(identityRole, elements.ToArray(), CustomClaimTypes.Element); await UpdateRoleClaimAsync(identityRole, role.Elements.ToArray(), CustomClaimTypes.DisPlayElement); } // 保存关联数据规则 if (role.DataRules != null) { await UpdateRoleClaimAsync(identityRole, role.DataRules, CustomClaimTypes.Rule); } return(true); } else { return(false); } }