public async Task <ApiResponse> UpdateRoleAsync([FromBody] RoleDto newRole)
        {
            try
            {
                // first make sure the role already exist
                if (!_roleManager.Roles.Any(r => r.Name == newRole.Name))
                {
                    return(new ApiResponse(Status400BadRequest, "This role doesn't exists"));
                }

                // Create the permissions
                IdentityRole <Guid> identityRole = await _roleManager.FindByNameAsync(newRole.Name);

                var claims = await _roleManager.GetClaimsAsync(identityRole);

                var permissions = claims.Where(x => x.Type == ClaimConstants.Permission).Select(x => x.Value).ToList();

                foreach (var permission in permissions)
                {
                    await _roleManager.RemoveClaimAsync(identityRole, new Claim(ClaimConstants.Permission, permission));
                }

                foreach (string claim in newRole.Permissions)
                {
                    var result = await _roleManager.AddClaimAsync(identityRole, new Claim(ClaimConstants.Permission, ApplicationPermissions.GetPermissionByName(claim)));

                    if (!result.Succeeded)
                    {
                        await _roleManager.DeleteAsync(identityRole);
                    }
                }
            }
            catch (Exception ex)
            {
                return(new ApiResponse(Status500InternalServerError, ex.Message));
            }
            return(new ApiResponse(Status200OK));
        }
Example #2
0
        public async Task <ApiResponse> CreateRoleAsync(RoleDto roleDto)
        {
            if (_roleManager.Roles.Any(r => r.Name == roleDto.Name))
            {
                return(new ApiResponse(Status400BadRequest, L["Role {0} already exists", roleDto.Name]));
            }

            var result = await _roleManager.CreateAsync(new ApplicationRole(roleDto.Name));

            if (!result.Succeeded)
            {
                var msg = string.Join(",", result.Errors.Select(i => i.Description));
                _logger.LogWarning($"Error while creating role {roleDto.Name}: {msg}");
                return(new ApiResponse(Status400BadRequest, msg));
            }

            // Re-create the permissions
            var role = await _roleManager.FindByNameAsync(roleDto.Name);

            foreach (var claim in roleDto.Permissions)
            {
                var resultAddClaim = await _roleManager.AddClaimAsync(role, new Claim(ClaimConstants.Permission, _applicationPermissions.GetPermissionByName(claim)));

                if (!resultAddClaim.Succeeded)
                {
                    await _roleManager.DeleteAsync(role);
                }
            }

            return(new ApiResponse(Status200OK, L["Role {0} created", roleDto.Name], roleDto)); //fix a strange System.Text.Json exception shown only in Debug_SSB
        }
        public async Task <ApiResponse> CreateRoleAsync([FromBody] RoleDto newRole)
        {
            try
            {
                // first make sure the role doesn't already exist
                if (_roleManager.Roles.Any(r => r.Name == newRole.Name))
                {
                    return(new ApiResponse(Status400BadRequest, "Role already exists"));
                }

                // Create the role
                var result = await _roleManager.CreateAsync(new IdentityRole <Guid>(newRole.Name));

                if (!result.Succeeded)
                {
                    string errorMessage = result.Errors.Select(x => x.Description).Aggregate((i, j) => i + " - " + j);
                    return(new ApiResponse(Status500InternalServerError, errorMessage));
                }

                // Re-create the permissions
                IdentityRole <Guid> role = await _roleManager.FindByNameAsync(newRole.Name);

                foreach (string claim in newRole.Permissions)
                {
                    var resultAddClaim = await _roleManager.AddClaimAsync(role, new Claim(ClaimConstants.Permission, ApplicationPermissions.GetPermissionByName(claim)));

                    if (!resultAddClaim.Succeeded)
                    {
                        await _roleManager.DeleteAsync(role);
                    }
                }
            }
            catch (Exception ex)
            {
                return(new ApiResponse(Status500InternalServerError, ex.Message));
            }

            return(new ApiResponse(Status200OK));
        }