public async Task <IActionResult> PutUser(int id, User user)
        {
            if (id != user.Id)
            {
                return(BadRequest());
            }

            _context.Entry(user).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!UserExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(NoContent());
        }
        public async Task <User> DeleteRolesFromUser(User user, IList <Role> roles)
        {
            var roleIds = roles.Select(r => r.Id);

            var roleUsers =
                AuthorizationDbContext.RoleUsers.Where(
                    ru => ru.SubjectId == user.SubjectId &&
                    ru.IdentityProvider == user.IdentityProvider &&
                    !ru.IsDeleted &&
                    roleIds.Contains(ru.RoleId));

            foreach (var roleUser in roleUsers)
            {
                var roleToRemove = roles.FirstOrDefault(r => r.Id == roleUser.RoleId);
                if (roleToRemove != null)
                {
                    user.Roles.Remove(roleToRemove);
                    roleUser.IsDeleted = true;
                }
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <User>(EventTypes.ChildEntityDeletedEvent, user.Id, user));

            return(user);
        }
        public async Task Delete(Group group)
        {
            var groupEntity = await AuthorizationDbContext.Groups
                              .Include(g => g.GroupRoles)
                              .Include(g => g.GroupUsers)
                              .SingleOrDefaultAsync(g => g.GroupId == Guid.Parse(group.Id));

            if (groupEntity == null)
            {
                throw new NotFoundException <Group>($"Could not find {typeof(Group).Name} entity with ID {group.Name}");
            }

            groupEntity.IsDeleted = true;

            foreach (var groupRole in groupEntity.GroupRoles)
            {
                if (!groupRole.IsDeleted)
                {
                    groupRole.IsDeleted = true;
                }
            }

            foreach (var groupUser in groupEntity.GroupUsers)
            {
                if (!groupUser.IsDeleted)
                {
                    groupUser.IsDeleted = true;
                }
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Group>(EventTypes.EntityDeletedEvent, group.Id, groupEntity.ToModel()));
        }
        public async Task Delete(Role role)
        {
            var roleEntity = await AuthorizationDbContext.Roles
                             .Include(r => r.RolePermissions)
                             .Include(r => r.GroupRoles)
                             .SingleOrDefaultAsync(r =>
                                                   r.RoleId == role.Id &&
                                                   !r.IsDeleted);

            if (roleEntity == null)
            {
                throw new NotFoundException <Role>($"Could not find {typeof(Role).Name} entity with ID {role.Id}");
            }

            roleEntity.IsDeleted = true;

            foreach (var rolePermission in roleEntity.RolePermissions)
            {
                rolePermission.IsDeleted = true;
            }

            foreach (var groupRole in roleEntity.GroupRoles)
            {
                groupRole.IsDeleted = true;
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Role>(EventTypes.EntityDeletedEvent, role.Id.ToString(), roleEntity.ToModel()));
        }
        public async Task <Group> Add(Group group)
        {
            var groupNameMatches = AuthorizationDbContext.Groups
                                   .Where(g => !g.IsDeleted &&
                                          g.Name == group.GroupIdentifier.GroupName).Select(e => e.ToModel()).ToList();

            if (groupNameMatches.Any())
            {
                if (group.SourceEquals(GroupConstants.CustomSource))
                {
                    throw new AlreadyExistsException <Group>(
                              $"Could not create group name {group.Name}. A group with the same name exists as a Custom group or a Directory group.");
                }

                if (groupNameMatches.Any(g =>
                                         new GroupIdentifierComparer().Equals(g.GroupIdentifier, group.GroupIdentifier)))
                {
                    throw new AlreadyExistsException <Group>(
                              $"Group {group.GroupIdentifier} already exists. Please use a different GroupName, IdentityProvider, or TenantId.");
                }
            }

            group.Id = Guid.NewGuid();
            var groupEntity = group.ToEntity();

            AuthorizationDbContext.Groups.Add(groupEntity);
            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Group>(EventTypes.EntityCreatedEvent, group.Id.ToString(), groupEntity.ToModel()));

            return(groupEntity.ToModel());
        }
        public async Task <Group> AddRolesToGroup(Group group, IEnumerable <Role> rolesToAdd)
        {
            var groupEntity = await AuthorizationDbContext.Groups.SingleOrDefaultAsync(g =>
                                                                                       g.Name == group.Name &&
                                                                                       g.TenantId == group.TenantId &&
                                                                                       g.IdentityProvider == group.IdentityProvider &&
                                                                                       !g.IsDeleted);

            if (groupEntity == null)
            {
                throw new NotFoundException <Group>($"Could not find {typeof(Group).Name} entity with ID {group.Name}");
            }

            foreach (var role in rolesToAdd)
            {
                group.Roles.Add(role);
                AuthorizationDbContext.GroupRoles.Add(new GroupRole
                {
                    GroupId = groupEntity.GroupId,
                    RoleId  = role.Id
                });
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Group>(EventTypes.ChildEntityCreatedEvent, group.Id.ToString(), group));

            return(group);
        }
        public async Task <Role> Add(Role role)
        {
            role.Id = Guid.NewGuid();
            var roleEntity = role.ToEntity();

            roleEntity.SecurableItem =
                AuthorizationDbContext.SecurableItems.First(s => !s.IsDeleted && s.Name == role.SecurableItem);

            if (role.ChildRoles.Any())
            {
                var childRoles = await AuthorizationDbContext.Roles.Where(r => role.ChildRoles.Contains(r.RoleId))
                                 .ToListAsync();

                foreach (var childRole in childRoles)
                {
                    childRole.ParentRole = roleEntity;
                }
            }

            AuthorizationDbContext.Roles.Add(roleEntity);
            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Role>(EventTypes.EntityCreatedEvent, role.Id.ToString(), roleEntity.ToModel()));

            return(roleEntity.ToModel());
        }
        public async Task <Role> AddPermissionsToRole(Role role, ICollection <Permission> allowPermissions,
                                                      ICollection <Permission> denyPermissions)
        {
            // TODO: handle case where role.Id may not exist in Roles table
            foreach (var permission in allowPermissions)
            {
                AuthorizationDbContext.RolePermissions.Add(new RolePermission
                {
                    RoleId           = role.Id,
                    PermissionId     = permission.Id,
                    PermissionAction = PermissionAction.Allow
                });

                role.Permissions.Add(permission);
            }

            foreach (var permission in denyPermissions)
            {
                AuthorizationDbContext.RolePermissions.Add(new RolePermission
                {
                    RoleId           = role.Id,
                    PermissionId     = permission.Id,
                    PermissionAction = PermissionAction.Deny
                });

                role.Permissions.Add(permission);
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Role>(EventTypes.EntityUpdatedEvent, role.Id.ToString(), role));

            return(role);
        }
        public async Task <Role> RemovePermissionsFromRole(Role role, Guid[] permissionIds)
        {
            var roleEntity = await AuthorizationDbContext.Roles
                             .Include(r => r.RolePermissions)
                             .SingleOrDefaultAsync(r =>
                                                   r.RoleId == role.Id &&
                                                   !r.IsDeleted);

            if (roleEntity == null)
            {
                throw new NotFoundException <Role>($"Could not find {typeof(Role).Name} entity with ID {role.Id}");
            }

            foreach (var permissionId in permissionIds)
            {
                var rolePermissionToRemove = roleEntity.RolePermissions.Single(
                    rp => rp.RoleId == roleEntity.RoleId &&
                    rp.PermissionId == permissionId);

                rolePermissionToRemove.IsDeleted = true;
                AuthorizationDbContext.RolePermissions.Update(rolePermissionToRemove);
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Role>(EventTypes.EntityUpdatedEvent, role.Id.ToString(), role));

            return(roleEntity.ToModel());
        }
        public async Task <Group> AddUsersToGroup(Group group, IEnumerable <User> usersToAdd)
        {
            var groupEntity = await AuthorizationDbContext.Groups.SingleOrDefaultAsync(g =>
                                                                                       g.Name == group.Name &&
                                                                                       g.TenantId == group.TenantId &&
                                                                                       g.IdentityProvider == group.IdentityProvider &&
                                                                                       !g.IsDeleted);

            if (groupEntity == null)
            {
                throw new NotFoundException <Group>($"Could not find {typeof(Group).Name} entity with ID {group.Name}");
            }

            var groupUsers = new List <GroupUser>();

            foreach (var user in usersToAdd)
            {
                group.Users.Add(user);
                var groupUser = new GroupUser
                {
                    GroupId          = groupEntity.GroupId,
                    IdentityProvider = user.IdentityProvider,
                    SubjectId        = user.SubjectId
                };

                AuthorizationDbContext.GroupUsers.Add(groupUser);
                groupUsers.Add(groupUser);
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Group>(EventTypes.ChildEntityCreatedEvent, group.Id.ToString(), group));

            return(group);
        }
        public async Task <Group> RemoveChildGroups(Group group, IEnumerable <Group> childGroups)
        {
            var childGroupList     = childGroups.ToList();
            var childGroupIds      = childGroupList.Select(g => g.Id);
            var childGroupEntities = AuthorizationDbContext.ChildGroups.Where(cg => !cg.IsDeleted && cg.ParentGroupId == group.Id && childGroupIds.Contains(cg.ChildGroupId));

            foreach (var childGroup in childGroupList)
            {
                var childToRemove = group.Children.FirstOrDefault(c => c.Name == childGroup.Name);
                if (childToRemove == null)
                {
                    continue;
                }

                group.Children.Remove(childToRemove);

                var childToRemoveEntity = childGroupEntities.FirstOrDefault(cg => cg.ParentGroupId == group.Id && cg.ChildGroupId == childGroup.Id);

                if (childToRemoveEntity != null)
                {
                    childToRemoveEntity.IsDeleted = true;
                }
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Group>(EventTypes.ChildEntityDeletedEvent, group.Id.ToString(), group));

            return(group);
        }
        public async Task Delete(Permission permission)
        {
            var permissionEntity = await AuthorizationDbContext.Permissions
                                   .Include(p => p.RolePermissions)
                                   .Include(p => p.UserPermissions)
                                   .SingleOrDefaultAsync(p =>
                                                         p.PermissionId == permission.Id &&
                                                         !p.IsDeleted);

            if (permissionEntity == null)
            {
                throw new NotFoundException <Permission>(
                          $"Could not find {typeof(Permission).Name} entity with ID {permission.Id}");
            }

            permissionEntity.IsDeleted = true;

            foreach (var rolePermission in permissionEntity.RolePermissions)
            {
                rolePermission.IsDeleted = true;
            }

            foreach (var userPermission in permissionEntity.UserPermissions)
            {
                userPermission.IsDeleted = true;
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Permission>(EventTypes.EntityDeletedEvent, permission.Id.ToString(), permissionEntity.ToModel()));
        }
Beispiel #13
0
        public async Task <Either <Exception, LoggedUser> > RegisterNewUser(RegisterUser model)
        {
            async Task AssignUserToRole(User user)
            {
                var claim        = _authdbContext.Claims.First(x => x.Key == "NormalUser");
                var claimsResult = _authdbContext.UserClaims.Add(new UserClaim()
                {
                    ClaimType = "NormalUser", ClaimValue = "NormalUser", UserId = user.Id
                });
                await _authdbContext.SaveChangesAsync();
            }

            try
            {
                var isUserExists = _authdbContext.Users.Find(x => x.Email == model.Email).Count().Equals(0);

                if (!isUserExists)
                {
                    return(new UserExistsException("Użytkownik o ponadym adresie email już istnieje"));
                }

                var userDbModel = new User()
                {
                    LastName  = model.LastName,
                    FirstName = model.FirstName,
                    Email     = model.Email
                };

                userDbModel.PasswordHash = _userManager.PasswordHasher.HashPassword(userDbModel, model.Password);

                _authdbContext.Users.Add(userDbModel);
                await _authdbContext.SaveChangesAsync();

                await AssignUserToRole(userDbModel);

                return(await SingInUser(new LoginModel()
                {
                    Email = model.Email, Password = model.Password
                }));
            }
            catch (Exception ex)
            {
                return(new Exception("Wystąpił nieoczekiwany błąd, spróbuj ponownie później"));
            }
        }
        public async Task <User> Add(User user)
        {
            var userEntity = user.ToEntity();

            AuthorizationDbContext.Users.Add(userEntity);
            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <User>(EventTypes.EntityCreatedEvent, user.Id, userEntity.ToModel()));

            return(userEntity.ToModel());
        }
Beispiel #15
0
        public async Task <UserModel> AddUser(string username,
                                              string firstName, string lastName, string email,
                                              byte[] passwordHash, byte[] passwordSalt, DateTime?createdDate)
        {
            var newUser = new UserModel()
            {
                Username             = username.ToLower(),
                FirstName            = firstName,
                LastName             = lastName,
                Email                = lastName.ToLower(),
                PasswordHash         = passwordHash,
                PasswordSalt         = passwordSalt,
                UserStatusId         = (int)UserStatus.Active,
                AuthenticationTypeId = (int)AuthenticationType.AuthApi,
                CreatedDate          = createdDate ?? DateTime.Now
            };
            await _authorizationDb.Users.AddAsync(newUser);

            await _authorizationDb.SaveChangesAsync();

            return(newUser);
        }
        public async Task <Permission> Add(Permission permission)
        {
            permission.Id = Guid.NewGuid();
            var permissionEntity = permission.ToEntity();

            permissionEntity.SecurableItem =
                AuthorizationDbContext.SecurableItems.First(s => !s.IsDeleted && s.Name == permission.SecurableItem);

            AuthorizationDbContext.Permissions.Add(permissionEntity);

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Permission>(EventTypes.EntityCreatedEvent, permission.Id.ToString(), permissionEntity.ToModel()));

            return(permissionEntity.ToModel());
        }
        public async Task <Group> AddUserToGroup(Group group, User user)
        {
            var groupUser = new GroupUser
            {
                GroupId          = Guid.Parse(group.Id),
                SubjectId        = user.SubjectId,
                IdentityProvider = user.IdentityProvider
            };

            AuthorizationDbContext.GroupUsers.Add(groupUser);
            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Group>(EventTypes.ChildEntityCreatedEvent, group.Id, group));

            return(group);
        }
        public async Task Update(Role role)
        {
            var roleEntity = await AuthorizationDbContext.Roles
                             .SingleOrDefaultAsync(r =>
                                                   r.RoleId == role.Id &&
                                                   !r.IsDeleted);

            if (roleEntity == null)
            {
                throw new NotFoundException <Role>($"Could not find {typeof(Role).Name} entity with ID {role.Id}");
            }

            role.ToEntity(roleEntity);
            AuthorizationDbContext.Roles.Update(roleEntity);
            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Role>(EventTypes.EntityUpdatedEvent, role.Id.ToString(), roleEntity.ToModel()));
        }
        public async Task <Group> DeleteRolesFromGroup(Group group, IEnumerable <Guid> roleIdsToDelete)
        {
            var groupRolesToRemove = AuthorizationDbContext.GroupRoles
                                     .Where(gr => roleIdsToDelete.Contains(gr.RoleId) &&
                                            gr.GroupId == group.Id &&
                                            !gr.IsDeleted).ToList();

            if (groupRolesToRemove.Count == 0)
            {
                throw new NotFoundException <Role>(
                          $"No role mappings found for group {group.Name} with the supplied role IDs");
            }

            var missingRoleMappings = new List <Guid>();

            foreach (var groupRole in groupRolesToRemove)
            {
                // remove the role from the domain model
                var roleToRemove = group.Roles.FirstOrDefault(r => r.Id == groupRole.RoleId);

                if (roleToRemove == null)
                {
                    missingRoleMappings.Add(groupRole.RoleId);
                }

                group.Roles.Remove(roleToRemove);

                // mark the many-to-many DB entity as deleted
                groupRole.IsDeleted = true;
                AuthorizationDbContext.GroupRoles.Update(groupRole);
            }

            if (missingRoleMappings.Any())
            {
                throw new NotFoundException <Role>(
                          $"No role mapping(s) found for group {group.Name} with the following role IDs: {missingRoleMappings.ToString(", ")}");
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Group>(EventTypes.ChildEntityDeletedEvent, group.Id.ToString(), group));

            return(group);
        }
        public async Task Update(Client client)
        {
            var clientEntity = await AuthorizationDbContext.Clients
                               .Include(i => i.TopLevelSecurableItem)
                               .SingleOrDefaultAsync(c => c.ClientId == client.Id &&
                                                     !c.IsDeleted);

            if (clientEntity == null)
            {
                throw new NotFoundException <Client>($"Could not find {typeof(Client).Name} entity with ID {client.Id}");
            }

            client.ToEntity(clientEntity);

            AuthorizationDbContext.Clients.Update(clientEntity);
            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Client>(EventTypes.EntityUpdatedEvent, client.Id, clientEntity.ToModel()));
        }
        public async Task Update(Group group)
        {
            var groupEntity = await AuthorizationDbContext.Groups
                              .Include(g => g.GroupRoles)
                              .Include(g => g.GroupUsers)
                              .SingleOrDefaultAsync(g => g.GroupId == group.Id);

            if (groupEntity == null)
            {
                throw new NotFoundException <Group>($"Could not find {typeof(Group).Name} entity with ID {group.Name}");
            }

            group.ToEntity(groupEntity);

            AuthorizationDbContext.Groups.Update(groupEntity);
            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Group>(EventTypes.EntityUpdatedEvent, group.Id.ToString(), groupEntity.ToModel()));
        }
        public async Task Delete(User user)
        {
            var userEntity = await AuthorizationDbContext.Users
                             .SingleOrDefaultAsync(u =>
                                                   u.IdentityProvider == user.IdentityProvider &&
                                                   u.SubjectId == user.SubjectId &&
                                                   !u.IsDeleted);

            if (userEntity == null)
            {
                throw new NotFoundException <User>(
                          $"Could not find {typeof(User).Name} User IDP = {user.IdentityProvider}, SubjectId = {user.SubjectId}");
            }

            userEntity.IsDeleted = true;
            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <User>(EventTypes.EntityDeletedEvent, user.Id, userEntity.ToModel()));
        }
        public async Task Update(Permission permission)
        {
            var permissionEntity = await AuthorizationDbContext.Permissions
                                   .SingleOrDefaultAsync(p =>
                                                         p.PermissionId == permission.Id &&
                                                         !p.IsDeleted);

            if (permissionEntity == null)
            {
                throw new NotFoundException <Permission>(
                          $"Could not find {typeof(Permission).Name} entity with ID {permission.Id}");
            }

            permission.ToEntity(permissionEntity);
            AuthorizationDbContext.Permissions.Update(permissionEntity);
            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Permission>(EventTypes.EntityUpdatedEvent, permission.Id.ToString(), permissionEntity.ToModel()));
        }
        public async Task <Group> AddChildGroups(Group group, IEnumerable <Group> childGroups)
        {
            foreach (var childGroup in childGroups)
            {
                var newChildGroup = new ChildGroup
                {
                    ParentGroupId = group.Id,
                    ChildGroupId  = childGroup.Id
                };

                AuthorizationDbContext.ChildGroups.Add(newChildGroup);
                group.Children.Add(childGroup);
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Group>(EventTypes.ChildEntityCreatedEvent, group.Id.ToString(), group));

            return(group);
        }
        public async Task <Group> Add(Group group)
        {
            var alreadyExists = await Exists(group.Name);

            if (alreadyExists)
            {
                throw new AlreadyExistsException <Group>(
                          $"Group {group.Name} already exists. Please use a different GroupName.");
            }

            group.Id = Guid.NewGuid().ToString();
            var groupEntity = group.ToEntity();

            AuthorizationDbContext.Groups.Add(groupEntity);
            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Group>(EventTypes.EntityCreatedEvent, group.Id, groupEntity.ToModel()));

            return(groupEntity.ToModel());
        }
        public async Task <Client> Add(Client client)
        {
            Grain grain = null;

            if (client.TopLevelSecurableItem != null)
            {
                grain = await _grainStore.Get(client.TopLevelSecurableItem.Grain);
            }

            var clientEntity = client.ToEntity();

            clientEntity.TopLevelSecurableItem.GrainId = grain?.Id;

            AuthorizationDbContext.Clients.Add(clientEntity);
            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Client>(EventTypes.EntityCreatedEvent, client.Id, clientEntity.ToModel()));

            return(client);
        }
        public async Task RemovePermissionFromRoles(Guid permissionId, string grain, string securableItem = null)
        {
            var roles = GetRoleEntityModels(grain, securableItem).ToList();

            foreach (var role in roles)
            {
                var rolePermissionToRemove = role.RolePermissions.SingleOrDefault(
                    rp => rp.RoleId == role.RoleId &&
                    rp.Permission.PermissionId == permissionId);

                if (rolePermissionToRemove != null)
                {
                    rolePermissionToRemove.IsDeleted = true;
                    AuthorizationDbContext.RolePermissions.Update(rolePermissionToRemove);
                }
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityBatchAuditEvent <EntityModels.Role>(EventTypes.EntityUpdatedEvent, roles));
        }
        public async Task <Group> DeleteUserFromGroup(Group group, User user)
        {
            var groupUser = await AuthorizationDbContext.GroupUsers
                            .SingleOrDefaultAsync(gu =>
                                                  gu.SubjectId == user.SubjectId &&
                                                  gu.IdentityProvider == user.IdentityProvider &&
                                                  gu.GroupId == group.Id && !gu.IsDeleted);

            if (groupUser == null)
            {
                return(group);
            }

            groupUser.IsDeleted = true;
            AuthorizationDbContext.GroupUsers.Update(groupUser);
            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <Group>(EventTypes.ChildEntityDeletedEvent,
                                                                            groupUser.Id.ToString(), group));

            return(group);
        }
        public async Task <IEnumerable <Group> > Add(IEnumerable <Group> groups)
        {
            var savedEntities = new List <Group>();
            var groupList     = groups.ToList();
            var eventList     = new List <EntityAuditEvent <Group> >();

            foreach (var group in groupList)
            {
                group.Id = Guid.NewGuid();
                var groupEntity = group.ToEntity();
                AuthorizationDbContext.Groups.Add(groupEntity);
                savedEntities.Add(group);
                eventList.Add(new EntityAuditEvent <Group>(EventTypes.EntityCreatedEvent, group.Id.ToString(), group));
            }

            await AuthorizationDbContext.SaveChangesAsync();

            if (eventList.Count > 0)
            {
                await EventService.RaiseEventsAsync(eventList);
            }
            return(savedEntities);
        }
        public async Task <User> AddRolesToUser(User user, IList <Role> roles)
        {
            var roleUsers = new List <RoleUser>();

            foreach (var role in roles)
            {
                user.Roles.Add(role);
                var roleUser = new RoleUser
                {
                    IdentityProvider = user.IdentityProvider,
                    SubjectId        = user.SubjectId,
                    RoleId           = role.Id
                };

                AuthorizationDbContext.RoleUsers.Add(roleUser);
                roleUsers.Add(roleUser);
            }

            await AuthorizationDbContext.SaveChangesAsync();

            await EventService.RaiseEventAsync(new EntityAuditEvent <User>(EventTypes.ChildEntityCreatedEvent, user.Id, user));

            return(user);
        }