Ejemplo n.º 1
0
        public async Task <ActionResult <UpdateClientSecretResponse> > HandleAsync(int id, UpdateClientSecretRequest request,
                                                                                   CancellationToken cancellationToken = default)
        {
            var toaster    = new ToasterEvent(nameof(ClientSecret), ToasterType.Success, ToasterVerbs.Updated);
            var validation =
                await _validator.ValidateAsync <UpdateClientSecretRequest, UpdateClientSecretResponse, UpdateRequestValidator>
                    (request, toaster, cancellationToken);

            if (validation.Failed)
            {
                return(validation.Response);
            }

            if (!_repository.Query().Any(e => e.Id == id && e.Type != AppConstants.SecretTypes.VisibleOneTime))
            {
                return(NotFound(id));
            }

            var entity = await _repository.Query().FirstOrDefaultAsync(e => e.Id == id, cancellationToken);

            entity.Expiration  = request.ExpiresAt;
            entity.Description = request.Description;
            entity.ClientId    = request.OwnerId;
            await _repository.SaveAsync(toaster);

            return(validation.Response);
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> HandleAsync(int[] apiScopeIds, CancellationToken cancellationToken = default)
        {
            var apiResourcesCount = await _repository.Query()
                                    .Where(x => apiScopeIds.ToList().Contains(x.Id) &&
                                           x.Name != AppConstants.ReadOnlyEntities.IdentityControlApiScope)
                                    .CountAsync(cancellationToken);

            if (apiResourcesCount == 0 || apiResourcesCount < apiScopeIds.Length)
            {
                return(NotFound("One ore more instances where not found"));
            }

            await _repository.Query()
            .Where(x => apiScopeIds.ToList().Contains(x.Id))
            .ForEachAsync(x =>
            {
                x.Enabled = false;
                x.ShowInDiscoveryDocument = false;
            }, cancellationToken);

            var toaster = new ToasterEvent(nameof(ApiScope), ToasterType.Success, ToasterVerbs.Disabled, null, apiResourcesCount);
            await _repository.SaveAsync(toaster, apiResourcesCount);

            return(Ok());
        }
Ejemplo n.º 3
0
        public override async Task <ActionResult <InsertClientSecretResponse> > HandleAsync(InsertClientSecretRequest request,
                                                                                            CancellationToken cancellationToken = default)
        {
            var toaster    = new ToasterEvent(nameof(ClientSecret), ToasterType.Success, ToasterVerbs.Created);
            var validation =
                await _validator.ValidateAsync <InsertClientSecretRequest, InsertClientSecretResponse, InsertRequestValidator>
                    (request, toaster, cancellationToken);

            if (validation.Failed)
            {
                return(validation.Response);
            }

            if (_repository.Query().Any(e => e.Value == request.Value && e.Type != AppConstants.SecretTypes.VisibleOneTime))
            {
                return(AspExtensions.GetBadRequestWithError <InsertClientSecretResponse>("This client secret already exists."));
            }

            var entity = new ClientSecret
            {
                Created     = DateTime.UtcNow,
                Description = request.Description,
                Type        = request.Type,
                Expiration  = request.Expiration,
                Value       = request.Value.Stamp(),
                ClientId    = request.OwnerId
            };

            await _repository.InsertAsync(entity);

            await _repository.SaveAsync(toaster);

            return(validation.Response);
        }
Ejemplo n.º 4
0
        public override async Task <ActionResult <InsertApiScopeResponse> > HandleAsync(InsertApiScopeRequest request,
                                                                                        CancellationToken cancellationToken = default)
        {
            var toaster    = new ToasterEvent(nameof(ApiScope), ToasterType.Success, ToasterVerbs.Created);
            var validation =
                await _validator.ValidateAsync <InsertApiScopeRequest, InsertApiScopeResponse, InsertApiScopeValidator>
                    (request, toaster, cancellationToken);

            if (validation.Failed)
            {
                return(validation.Response);
            }

            if (_repository.Query().Any(e => e.Name == request.Name))
            {
                return(AspExtensions.GetBadRequestWithError <InsertApiScopeResponse>(
                           $"API Scope \"{request.Name}\" already exists."));
            }

            var entity = new ApiScope
            {
                Name        = request.Name,
                DisplayName = request.DisplayName,
                Description = request.Description
            };

            toaster.Identifier = entity.Name;
            await _repository.InsertAsync(entity);

            await _repository.SaveAsync(toaster);

            return(validation.Response);
        }
Ejemplo n.º 5
0
        public async Task <ActionResult <UpdateClientSecretResponse> > HandleAsync(int id, RegenerateClientSecretRequest request,
                                                                                   CancellationToken cancellationToken = default)
        {
            var toaster    = new ToasterEvent(nameof(ClientSecret), ToasterType.Success, ToasterVerbs.Updated);
            var validation = await _validator
                             .ValidateAsync <RegenerateClientSecretRequest, UpdateClientSecretResponse, RegenerateRequestValidator>
                                 (request, toaster, cancellationToken);

            if (validation.Failed)
            {
                return(validation.Response);
            }

            if (!_repository.Query().Any(e => e.Id == id && e.Type != AppConstants.SecretTypes.VisibleOneTime))
            {
                return(NotFound(id));
            }

            if (_repository.Query().Any(e => e.Value == request.Value && e.Type != AppConstants.SecretTypes.VisibleOneTime))
            {
                return(AspExtensions.GetBadRequestWithError <UpdateClientSecretResponse>("This client secret already exists."));
            }

            var entity = await _repository.Query().FirstOrDefaultAsync(e => e.Id == id, cancellationToken);

            entity.Value = request.Value.Stamp();

            await _repository.SaveAsync(toaster);

            return(validation.Response);
        }
Ejemplo n.º 6
0
        public async Task <ActionResult <UpdateClientResponse> > HandleAsync(int id, UpdateClientRequest request,
                                                                             CancellationToken cancellationToken = default)
        {
            var toaster    = new ToasterEvent(nameof(Client), ToasterType.Success, ToasterVerbs.Updated);
            var validation =
                await _validator.ValidateAsync <UpdateClientRequest, UpdateClientResponse, UpdateClientValidator>
                    (request, toaster, cancellationToken);

            if (validation.Failed)
            {
                return(validation.Response);
            }

            // if (!_clientRepository.Query().Any(e => e.Id == id && e.ClientId != AppConstants.ReadOnlyEntities.AngularClient))
            if (!_clientRepository.Query().Any(e => e.Id == id))
            {
                return(NotFound(id));
            }

            if (_clientRepository.Query()
                .Any(e => (e.ClientId == request.Name || e.ClientUri == request.ClientUri) && e.Id != id))
            {
                return(AspExtensions.GetBadRequestWithError <UpdateClientResponse>($"Client \"{request.Name}\" already exists."));
            }

            await _clientRepository.Query().Where(e => e.Id == id).UpdateAsync(x => new Client
            {
                ClientId                    = request.Name,
                ClientName                  = request.DisplayName,
                Description                 = request.Description,
                NonEditable                 = request.IsReadOnly,
                Updated                     = DateTime.UtcNow,
                RequirePkce                 = request.RequirePkce,
                AccessTokenLifetime         = request.AccessTokenLifetime * 60, // transform minutes in seconds,
                ClientUri                   = request.ClientUri,
                AllowOfflineAccess          = request.AllowOfflineAccess,
                RequireClientSecret         = request.RequireClientSecret,
                AllowAccessTokensViaBrowser = request.AllowAccessTokensViaBrowser
            }, cancellationToken);

            // Assignment of API Scopes
            if (request.ApiScopes != null && request.ApiScopes.Length > 0)
            {
                // Clean current relations
                await _clientScopeRepository.Query().Where(x => x.ClientId == id).DeleteAsync(cancellationToken);

                // Add new ones
                var clientApiScopes = request.ApiScopes.Select(x => new ClientScope {
                    Scope = x, ClientId = id
                });
                await _clientScopeRepository.InsertRange(clientApiScopes);

                await _clientRepository.SaveAsync(toaster);
            }

            return(validation.Response);
        }
Ejemplo n.º 7
0
        public async Task <ActionResult <UpdateApiScopeResponse> > HandleAsync(int id, UpdateApiScopeRequest request,
                                                                               CancellationToken cancellationToken = default)
        {
            var toaster    = new ToasterEvent(nameof(ApiScope), ToasterType.Success, ToasterVerbs.Updated);
            var validation =
                await _validator.ValidateAsync <UpdateApiScopeRequest, UpdateApiScopeResponse, UpdateApiScopeValidator>
                    (request, toaster, cancellationToken);

            if (validation.Failed)
            {
                return(validation.Response);
            }

            if (!_apiScopeRepository.Query()
                .Any(e => e.Id == id && e.Name != AppConstants.ReadOnlyEntities.IdentityControlApiScope))
            {
                return(NotFound(id));
            }

            if (_apiScopeRepository.Query().Any(e => e.Name == request.Name && e.Id != id))
            {
                return(AspExtensions.GetBadRequestWithError <UpdateApiScopeResponse>(
                           $"API Scope \"{request.Name}\" already exists."));
            }

            var entity = await _apiScopeRepository.Query().FirstOrDefaultAsync(e => e.Id == id, cancellationToken);

            if (entity.Name != request.Name)
            {
                await _clientScopeRepository.Query()
                .Where(x => x.Scope == entity.Name)
                .UpdateAsync(x => new ClientScope {
                    Scope = request.Name
                }, cancellationToken);

                await _apiResourceScopeRepo.Query()
                .Where(x => x.Scope == entity.Name)
                .UpdateAsync(x => new ApiResourceScope {
                    Scope = request.Name
                }, cancellationToken);

                entity.Name = request.Name;
            }

            entity.Description = request.Description;
            entity.DisplayName = request.DisplayName;

            toaster.Identifier = entity.Name;
            await _apiScopeRepository.SaveAsync(toaster);

            return(validation.Response);
        }
Ejemplo n.º 8
0
        public async Task <ActionResult <UpdateApiResourceResponse> > HandleAsync(int id, UpdateApiResourceRequest request,
                                                                                  CancellationToken cancellationToken = default)
        {
            var toaster    = new ToasterEvent(nameof(ApiScope), ToasterType.Success, ToasterVerbs.Updated);
            var validation =
                await _validator.ValidateAsync <UpdateApiResourceRequest, UpdateApiResourceResponse, UpdateApiResourceValidator>
                    (request, toaster, cancellationToken);

            if (validation.Failed)
            {
                return(validation.Response);
            }

            if (!_apiResourceRepository.Query()
                .Any(e => e.Id == id && e.Name != AppConstants.ReadOnlyEntities.IdentityControlApiScope))
            {
                return(NotFound(id));
            }

            if (_apiResourceRepository.Query().Any(e => e.Name == request.Name && e.Id != id))
            {
                return(AspExtensions.GetBadRequestWithError <UpdateApiResourceResponse>(
                           $"API Resource \"{request.Name}\" already exists."));
            }

            await _apiResourceRepository.Query().Where(e => e.Id == id)
            .UpdateAsync(x => new ApiResource
            {
                Name        = request.Name,
                Description = request.Description,
                DisplayName = request.DisplayName
            }, cancellationToken);

            // Assignment of API Scopes
            if (request.ApiScopes != null && request.ApiScopes.Length > 0)
            {
                // Clean current relations
                await _apiResourceScopeRepo.Query().Where(x => x.ApiResourceId == id).DeleteAsync(cancellationToken);

                // Add new relations
                var apiResourceScopes =
                    request.ApiScopes.Select(x => new ApiResourceScope {
                    Scope = x, ApiResourceId = id
                });
                await _apiResourceScopeRepo.InsertRange(apiResourceScopes);

                await _apiResourceRepository.SaveAsync(toaster);
            }

            return(validation.Response);
        }
        public override async Task <ActionResult <UpdateApiResourceSecretResponse> > HandleAsync(
            RegenerateApiResourceSecretRequest[] request,
            CancellationToken cancellationToken = default)
        {
            var secretsCount = await _repository.Query()
                               .Where(entity => request.Select(r => r.Id)
                                      .Contains(entity.Id) && entity.Type != AppConstants.SecretTypes.VisibleOneTime)
                               .CountAsync(cancellationToken);

            if (secretsCount == 0 || secretsCount < request.Length)
            {
                return(NotFound("One ore more instances could not be updated"));
            }

            var toaster = new ToasterEvent(nameof(ApiResourceSecret), ToasterType.Success, ToasterVerbs.Updated, null,
                                           request.Length);

            foreach (var item in request)
            {
                var validation = await _validator
                                 .ValidateAsync <RegenerateApiResourceSecretRequest, UpdateApiResourceSecretResponse,
                                                 RegenerateApiResourceSecretRequestValidator>
                                     (item, toaster, cancellationToken);

                if (validation.Failed)
                {
                    return(validation.Response);
                }
            }

            if (_repository.Query().Any(e => request.Any(x => x.Value == e.Value) &&
                                        e.Type != AppConstants.SecretTypes.VisibleOneTime))
            {
                return(AspExtensions.GetBadRequestWithError <UpdateApiResourceSecretResponse>(
                           "One of the new values is already registered."));
            }

            await _repository.Query()
            .Where(entity => request.Select(r => r.Id)
                   .Contains(entity.Id) && entity.Type != AppConstants.SecretTypes.VisibleOneTime)
            .ForEachAsync(entity => { entity.Value = request.First(r => r.Id == entity.Id).Value.Stamp(); }
                          , cancellationToken);

            await _repository.SaveAsync(toaster, secretsCount);

            return(new UpdateApiResourceSecretResponse
            {
                Succeeded = true
            });
        }
Ejemplo n.º 10
0
        public override async Task <ActionResult <InsertClientResponse> > HandleAsync(InsertClientRequest request,
                                                                                      CancellationToken cancellationToken = default)
        {
            var toaster    = new ToasterEvent(nameof(Client), ToasterType.Success, ToasterVerbs.Created);
            var validation =
                await _validator.ValidateAsync <InsertClientRequest, InsertClientResponse, InsertClientValidator>
                    (request, toaster, cancellationToken);

            if (validation.Failed)
            {
                return(validation.Response);
            }

            if (_clientRepository.Query().Any(e => e.ClientId == request.Name || e.ClientUri == request.ClientUri))
            {
                return(AspExtensions.GetBadRequestWithError <InsertClientResponse>($"Client \"{request.Name}\" already exists."));
            }

            var entity = new Client
            {
                ClientId                    = request.Name,
                ClientName                  = request.DisplayName,
                Description                 = request.Description,
                NonEditable                 = request.IsReadOnly,
                Created                     = DateTime.UtcNow,
                RequirePkce                 = request.RequirePkce,
                AccessTokenLifetime         = request.AccessTokenLifetime * 60, // transform minutes in seconds
                ClientUri                   = request.ClientUri,
                AllowOfflineAccess          = request.AllowOfflineAccess,
                RequireClientSecret         = request.RequireClientSecret,
                AllowAccessTokensViaBrowser = request.AllowAccessTokensViaBrowser
            };

            toaster.Identifier = entity.ClientName;
            await _clientRepository.InsertAsync(entity);

            await _clientRepository.SaveAsync(toaster);

            // Assignment of API Scopes
            if (request.ApiScopes != null && request.ApiScopes.Length > 0)
            {
                var clientApiScopes = request.ApiScopes.Select(x => new ClientScope {
                    Scope = x, ClientId = entity.Id
                });
                await _clientScopeRepository.InsertRange(clientApiScopes);
            }

            return(validation.Response);
        }
Ejemplo n.º 11
0
        public async Task <IActionResult> HandleAsync(int id, CancellationToken cancellationToken = default)
        {
            var entity = await _repository.Query()
                         .FirstOrDefaultAsync(e => e.Id == id, cancellationToken);

            if (entity == null)
            {
                return(NotFound($"Instance with ID {id} was not found"));
            }

            _repository.Delete(entity);
            var toaster = new ToasterEvent(nameof(ApiResourceSecret), ToasterType.Info, ToasterVerbs.Deleted);
            await _repository.SaveAsync(toaster);

            return(NoContent());
        }
Ejemplo n.º 12
0
        public async Task <IActionResult> HandleAsync(int id, CancellationToken cancellationToken = default)
        {
            if (!_repository.Query().Any(e => e.Id == id && e.ClientId != AppConstants.ReadOnlyEntities.AngularClient))
            {
                return(NotFound($"Instance with ID {id} was not found"));
            }

            var entity = await _repository.Query().FirstOrDefaultAsync(e => e.Id == id, cancellationToken);

            entity.Enabled = true;

            var toaster = new ToasterEvent(nameof(Client), ToasterType.Success, ToasterVerbs.Enabled, entity.ClientName);
            await _repository.SaveAsync(toaster);

            return(Ok());
        }
Ejemplo n.º 13
0
        public async Task <IActionResult> HandleAsync(int id, CancellationToken cancellationToken = default)
        {
            var entity = await _repository.Query()
                         .Where(e => e.Id == id && e.Name != AppConstants.ReadOnlyEntities.IdentityControlApiScope)
                         .FirstOrDefaultAsync(cancellationToken);

            if (entity == null)
            {
                return(NotFound($"Instance with ID {id} was not found"));
            }

            _repository.Delete(entity);
            var toaster = new ToasterEvent(nameof(ApiScope), ToasterType.Info, ToasterVerbs.Deleted, entity.Name);
            await _repository.SaveAsync(toaster);

            return(NoContent());
        }
Ejemplo n.º 14
0
        public async Task <IActionResult> HandleAsync(int[] apiScopeIds, CancellationToken cancellationToken = default)
        {
            var clientsCount = await _repository.Query()
                               .Where(x => apiScopeIds.ToList().Contains(x.Id) && x.ClientId != AppConstants.ReadOnlyEntities.AngularClient)
                               .CountAsync(cancellationToken);

            if (clientsCount == 0 || clientsCount < apiScopeIds.Length)
            {
                return(NotFound("One ore more instances where not found"));
            }

            await _repository.Query().Where(x => apiScopeIds.Contains(x.Id)).DeleteAsync(cancellationToken);

            var toaster = new ToasterEvent(nameof(Client), ToasterType.Info, ToasterVerbs.Deleted, null, clientsCount);
            await _repository.SaveAsync(toaster, 0);

            return(NoContent());
        }
Ejemplo n.º 15
0
        public async Task <IActionResult> HandleAsync(int id, CancellationToken cancellationToken = default)
        {
            if (!_repository.Query().Any(x => x.Id == id && x.Name != AppConstants.ReadOnlyEntities.IdentityControlApiScope))
            {
                return(NotFound($"Instance with ID {id} was not found"));
            }

            var entity = await _repository.Query().FirstOrDefaultAsync(e => e.Id == id, cancellationToken);

            entity.Enabled = false;
            entity.ShowInDiscoveryDocument = false;

            _repository.Update(entity);
            var toaster = new ToasterEvent(nameof(ApiScope), ToasterType.Success, ToasterVerbs.Disabled, entity.Name);
            await _repository.SaveAsync(toaster);

            return(Ok());
        }
Ejemplo n.º 16
0
        public async Task <IActionResult> HandleAsync(int[] secretIds, CancellationToken cancellationToken = default)
        {
            var secretsCount = await _repository.Query()
                               .Where(x => secretIds.ToList().Contains(x.Id))
                               .CountAsync(cancellationToken);

            if (secretsCount == 0 || secretsCount < secretIds.Length)
            {
                return(NotFound("One ore more instances where not found"));
            }

            await _repository.Query().Where(x => secretIds.Contains(x.Id))
            .DeleteAsync(cancellationToken);

            var toaster = new ToasterEvent(nameof(ClientSecret), ToasterType.Info, ToasterVerbs.Deleted, null, secretsCount);
            await _repository.SaveAsync(toaster, 0);

            return(NoContent());
        }
        public async Task <ActionResult <ClientChildAssignmentResponse> > HandleAsync(int id, ClientChildType childType, int childId,
                                                                                      CancellationToken cancellationToken = default)
        {
            if (!_clientRepository.Query()
                .Any(e => e.Id == id && e.ClientId != AppConstants.ReadOnlyEntities.AngularClient))
            {
                return(NotFound(id));
            }

            var toaster = new ToasterEvent(nameof(Client), ToasterType.Info, ToasterVerbs.Deleted);

            switch (childType)
            {
            case ClientChildType.GrantType:
                _grantsRepository.Delete(childId);
                await _grantsRepository.SaveAsync(toaster);

                break;

            case ClientChildType.RedirectUri:
                _redirectUriRepository.Delete(childId);
                await _redirectUriRepository.SaveAsync(toaster);

                break;

            case ClientChildType.LogoutRedirectUri:
                _logoutRedirectUrisRepository.Delete(childId);
                await _logoutRedirectUrisRepository.SaveAsync(toaster);

                break;

            case ClientChildType.CorsOrigin:
                _corsRepository.Delete(childId);
                await _corsRepository.SaveAsync(toaster);

                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(NoContent());
        }
Ejemplo n.º 18
0
        public override async Task <ActionResult <InsertApiResourceResponse> > HandleAsync(InsertApiResourceRequest request,
                                                                                           CancellationToken cancellationToken = default)
        {
            var toaster    = new ToasterEvent(nameof(ApiResource), ToasterType.Success, ToasterVerbs.Created);
            var validation = await _validator
                             .ValidateAsync <InsertApiResourceRequest, InsertApiResourceResponse, InsertApiResourceValidator>
                                 (request, toaster, cancellationToken);

            if (validation.Failed)
            {
                return(validation.Response);
            }

            if (_apiResourceRepository.Query().Any(e => e.Name == request.Name))
            {
                return(AspExtensions.GetBadRequestWithError <InsertApiResourceResponse>(
                           $"ApiResource \"{request.Name}\" already exists."));
            }

            var entity = new ApiResource
            {
                Name        = request.Name,
                DisplayName = request.DisplayName,
                Description = request.Description
            };

            toaster.Identifier = entity.Name;
            await _apiResourceRepository.InsertAsync(entity);

            await _apiResourceRepository.SaveAsync(toaster);

            // Assignment of API Scopes
            if (request.ApiScopes != null && request.ApiScopes.Length > 0)
            {
                var apiResourceScopes =
                    request.ApiScopes.Select(x => new ApiResourceScope {
                    Scope = x, ApiResourceId = entity.Id
                });
                await _apiResourceScopeRepo.InsertRange(apiResourceScopes);
            }

            return(validation.Response);
        }
        public async Task <ActionResult <ClientChildAssignmentResponse> > HandleAsync(int id, ClientChildAssignmentRequest request,
                                                                                      CancellationToken cancellationToken = default)
        {
            var toaster    = new ToasterEvent(nameof(Client), ToasterType.Success, ToasterVerbs.Updated);
            var validation =
                await _validator
                .ValidateAsync <ClientChildAssignmentRequest, ClientChildAssignmentResponse,
                                ClientValidators.ClientChildAssignmentValidator>
                    (request, toaster, cancellationToken);

            if (validation.Failed)
            {
                return(validation.Response);
            }

            if (!_clientRepository.Query()
                .Any(e => e.Id == id && e.ClientId != AppConstants.ReadOnlyEntities.AngularClient))
            {
                return(NotFound(id));
            }

            switch (request.Type)
            {
            case ClientChildType.GrantType:
                await _grantsRepository.InsertAsync(new ClientGrantType
                {
                    ClientId  = id,
                    GrantType = request.Value
                });

                await _grantsRepository.SaveAsync(toaster);

                break;

            case ClientChildType.RedirectUri:
                await _redirectUriRepository.InsertAsync(new ClientRedirectUri
                {
                    ClientId    = id,
                    RedirectUri = request.Value
                });

                await _redirectUriRepository.SaveAsync(toaster);

                break;

            case ClientChildType.LogoutRedirectUri:
                await _logoutRedirectUrisRepository.InsertAsync(new ClientPostLogoutRedirectUri
                {
                    ClientId = id,
                    PostLogoutRedirectUri = request.Value
                });

                await _logoutRedirectUrisRepository.SaveAsync(toaster);

                break;

            case ClientChildType.CorsOrigin:
                await _corsRepository.InsertAsync(new ClientCorsOrigin
                {
                    ClientId = id,
                    Origin   = request.Value
                });

                await _corsRepository.SaveAsync(toaster);

                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(validation.Response);
        }