From c400611375010ade9f17a5cc3fd4ab43d6c59d89 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Mon, 13 Apr 2026 20:30:55 +0100 Subject: [PATCH 1/2] wip --- SecurityService/Factories/ModelFactory.cs | 270 ++++++++---------- .../HostedServices/DatabaseInitializer.cs | 86 +++--- 2 files changed, 161 insertions(+), 195 deletions(-) diff --git a/SecurityService/Factories/ModelFactory.cs b/SecurityService/Factories/ModelFactory.cs index 8d40611e..a0964e96 100644 --- a/SecurityService/Factories/ModelFactory.cs +++ b/SecurityService/Factories/ModelFactory.cs @@ -1,203 +1,181 @@ using SecurityService.DataTransferObjects; using SecurityService.Models; -namespace SecurityService.Factories -{ - using System.Collections.Generic; - using System.Linq; +namespace SecurityService.Factories; - public static class ModelFactory { - #region Methods +using System.Collections.Generic; +using System.Linq; - public static UserResponse ConvertFrom(UserDetails model) { - if (model == null) { - return null; - } - - return new UserResponse - { - UserName = model.UserName, - PhoneNumber = model.PhoneNumber, - Roles = model.Roles, - Claims = model.Claims, - UserId = model.UserId, - EmailAddress = model.EmailAddress, - //RegistrationDateTime = model.RegistrationDateTime - FamilyName = model.FamilyName, - GivenName = model.GivenName, - MiddleName = model.MiddleName - }; +public static class ModelFactory { + public static UserResponse ConvertFrom(UserDetails model) { + if (model == null) { + return null; } - public static RoleResponse ConvertFrom(RoleDetails model) { - if (model == null) { - return null; - } + return new UserResponse { + UserName = model.UserName, + PhoneNumber = model.PhoneNumber, + Roles = model.Roles, + Claims = model.Claims, + UserId = model.UserId, + EmailAddress = model.EmailAddress, + RegistrationDateTime = model.RegistrationDateTime + FamilyName = model.FamilyName, + GivenName = model.GivenName, + MiddleName = model.MiddleName + }; + } - return new RoleResponse { RoleId = model.RoleId, Name = model.Name }; + public static RoleResponse ConvertFrom(RoleDetails model) { + if (model == null) { + return null; } - public static List ConvertFrom(List model) { - if (model == null || model.Any() == false) { - return new List(); - } + return new RoleResponse { RoleId = model.RoleId, Name = model.Name }; + } - List userDetailsList = new List(); + public static List ConvertFrom(List model) { + if (model == null || model.Any() == false) { + return new List(); + } - foreach (UserDetails userDetails in model) { - userDetailsList.Add(ConvertFrom(userDetails)); - } + List userDetailsList = new List(); - return userDetailsList; + foreach (UserDetails userDetails in model) { + userDetailsList.Add(ConvertFrom(userDetails)); } - public static List ConvertFrom(List model) { - if (model == null || model.Any() == false) { - return new List(); - } + return userDetailsList; + } - List roleDetailsList = new List(); + public static List ConvertFrom(List model) { + if (model == null || model.Any() == false) { + return new List(); + } - foreach (RoleDetails roleDetails in model) { - roleDetailsList.Add(ConvertFrom(roleDetails)); - } + List roleDetailsList = new List(); - return roleDetailsList; + foreach (RoleDetails roleDetails in model) { + roleDetailsList.Add(ConvertFrom(roleDetails)); } + return roleDetailsList; + } - public static ClientResponse ConvertFrom(ClientDetails model) { - if (model == null) { - return null; - } - return new ClientResponse - { - ClientId = model.ClientId, - AllowedScopes = model.AllowedScopes.ToList(), - AllowedGrantTypes = model.AllowedGrantTypes.ToList(), - ClientName = model.ClientName, - Description = model.Description, - PostLogoutRedirectUris = model.PostLogoutRedirectUris.ToList(), - RequireConsent = model.RequireConsent, - RedirectUris = model.RedirectUris.ToList(), - AllowOfflineAccess = model.AllowOfflineAccess, - ClientType = model.ClientType, - ClientUri = model.ClientUri - }; + public static ClientResponse ConvertFrom(ClientDetails model) { + if (model == null) { + return null; } - public static List ConvertFrom(List model) { - if (model == null || model.Any() == false) { - return new List(); - } + return new ClientResponse { + ClientId = model.ClientId, + AllowedScopes = model.AllowedScopes.ToList(), + AllowedGrantTypes = model.AllowedGrantTypes.ToList(), + ClientName = model.ClientName, + Description = model.Description, + PostLogoutRedirectUris = model.PostLogoutRedirectUris.ToList(), + RequireConsent = model.RequireConsent, + RedirectUris = model.RedirectUris.ToList(), + AllowOfflineAccess = model.AllowOfflineAccess, + ClientType = model.ClientType, + ClientUri = model.ClientUri + }; + } - List clientDetailsList = new List(); + public static List ConvertFrom(List model) { + if (model == null || model.Any() == false) { + return new List(); + } - foreach (ClientDetails client in model) { - clientDetailsList.Add(ConvertFrom(client)); - } + List clientDetailsList = new List(); - return clientDetailsList; + foreach (ClientDetails client in model) { + clientDetailsList.Add(ConvertFrom(client)); } - public static ApiResourceResponse ConvertFrom(ApiResourceDetails model) { - if (model == null) { - return null; - } + return clientDetailsList; + } - return new ApiResourceResponse - { - Description = model.Description, - Scopes = model.Scopes.ToList(), - Name = model.Name, - DisplayName = model.DisplayName, - UserClaims = model.UserClaims.ToList(), - }; + public static ApiResourceResponse ConvertFrom(ApiResourceDetails model) { + if (model == null) { + return null; } - public static List ConvertFrom(List model) - { - if (model == null || model.Any() == false) - { - return new List(); - } + return new ApiResourceResponse { + Description = model.Description, + Scopes = model.Scopes.ToList(), + Name = model.Name, + DisplayName = model.DisplayName, + UserClaims = model.UserClaims.ToList(), + }; + } - List apiResourceResponseList = new List(); + public static List ConvertFrom(List model) { + if (model == null || model.Any() == false) { + return new List(); + } - foreach (ApiResourceDetails apiResource in model) - { - apiResourceResponseList.Add(ConvertFrom(apiResource)); - } + List apiResourceResponseList = new List(); - return apiResourceResponseList; + foreach (ApiResourceDetails apiResource in model) { + apiResourceResponseList.Add(ConvertFrom(apiResource)); } - public static ApiScopeResponse ConvertFrom(ApiScopeDetails model) - { - if (model == null) - { - return null; - } + return apiResourceResponseList; + } - return new ApiScopeResponse { DisplayName = model.DisplayName, Name = model.Name, Description = model.Description }; + public static ApiScopeResponse ConvertFrom(ApiScopeDetails model) { + if (model == null) { + return null; } - public static List ConvertFrom(List model) - { - if (model == null || model.Any() == false) - { - return new List(); - } + return new ApiScopeResponse { DisplayName = model.DisplayName, Name = model.Name, Description = model.Description }; + } - List apiScopeDetailsList = new List(); + public static List ConvertFrom(List model) { + if (model == null || model.Any() == false) { + return new List(); + } - foreach (ApiScopeDetails apiScope in model) - { - apiScopeDetailsList.Add(ConvertFrom(apiScope)); - } + List apiScopeDetailsList = new List(); - return apiScopeDetailsList; + foreach (ApiScopeDetails apiScope in model) { + apiScopeDetailsList.Add(ConvertFrom(apiScope)); } - public static IdentityResourceResponse ConvertFrom(IdentityResourceDetails model) - { - if (model == null) - { - return null; - } + return apiScopeDetailsList; + } - return new IdentityResourceResponse - { - Claims = model.Claims.ToList(), - DisplayName = model.DisplayName, - Emphasize = model.Emphasize, - Required = model.Required, - ShowInDiscoveryDocument = model.ShowInDiscoveryDocument, - Description = model.Description, - Name = model.Name - }; + public static IdentityResourceResponse ConvertFrom(IdentityResourceDetails model) { + if (model == null) { + return null; } + return new IdentityResourceResponse { + Claims = model.Claims.ToList(), + DisplayName = model.DisplayName, + Emphasize = model.Emphasize, + Required = model.Required, + ShowInDiscoveryDocument = model.ShowInDiscoveryDocument, + Description = model.Description, + Name = model.Name + }; + } - public static List ConvertFrom(List model) - { - if (model == null || model.Any() == false) - { - return new List(); - } - List identityResourceDetailsList = new List(); + public static List ConvertFrom(List model) { + if (model == null || model.Any() == false) { + return new List(); + } - foreach (IdentityResourceDetails identityResource in model) - { - identityResourceDetailsList.Add(ConvertFrom(identityResource)); - } + List identityResourceDetailsList = new List(); - return identityResourceDetailsList; + foreach (IdentityResourceDetails identityResource in model) { + identityResourceDetailsList.Add(ConvertFrom(identityResource)); } - #endregion + return identityResourceDetailsList; } } \ No newline at end of file diff --git a/SecurityService/HostedServices/DatabaseInitializer.cs b/SecurityService/HostedServices/DatabaseInitializer.cs index ac0f1f69..b7e3ac36 100644 --- a/SecurityService/HostedServices/DatabaseInitializer.cs +++ b/SecurityService/HostedServices/DatabaseInitializer.cs @@ -3,71 +3,59 @@ using OpenIddict.Abstractions; using SecurityService.BusinessLogic; using SecurityService.Database.DbContexts; +using Shared.Logger; using static OpenIddict.Abstractions.OpenIddictConstants; namespace SecurityService.HostedServices; public sealed class DatabaseInitializer : IHostedService { - private readonly IServiceProvider _serviceProvider; - private readonly ServiceOptions _options; - private readonly ILogger _logger; + private readonly IServiceProvider ServiceProvider; + private readonly ServiceOptions Options; - public DatabaseInitializer(IServiceProvider serviceProvider, IOptions options, ILogger logger) + public DatabaseInitializer(IServiceProvider serviceProvider, IOptions options) { - this._serviceProvider = serviceProvider; - this._options = options.Value; - this._logger = logger; + this.ServiceProvider = serviceProvider; + this.Options = options.Value; } public async Task StartAsync(CancellationToken cancellationToken) { - this._logger.LogInformation("Starting database initialization for security service."); - using IServiceScope scope = this._serviceProvider.CreateScope(); + try { + Logger.LogWarning("Starting database initialization for security service."); + using IServiceScope scope = this.ServiceProvider.CreateScope(); + + SecurityServiceDbContext dbContext = scope.ServiceProvider.GetRequiredService(); + if (this.Options.UseInMemoryDatabase) { + Logger.LogInformation($"Using in-memory database '{this.Options.InMemoryDatabaseName}'."); + await dbContext.Database.EnsureCreatedAsync(cancellationToken); + } + else { + Logger.LogInformation("Applying database migrations."); + await dbContext.Database.MigrateAsync(cancellationToken); + } - SecurityServiceDbContext dbContext = scope.ServiceProvider.GetRequiredService(); - if (this._options.UseInMemoryDatabase) - { - this._logger.LogInformation("Using in-memory database '{DatabaseName}'.", this._options.InMemoryDatabaseName); - await dbContext.Database.EnsureCreatedAsync(cancellationToken); - } - else - { - this._logger.LogInformation("Applying database migrations."); - await dbContext.Database.MigrateAsync(cancellationToken); - } + if (this.Options.SeedDefaultScopes == false) { + Logger.LogInformation("Default scope seeding is disabled."); + } + else { + IOpenIddictScopeManager scopeManager = scope.ServiceProvider.GetRequiredService(); + (string Name, string DisplayName, string Description)[] defaultScopes = [(Scopes.Profile, "Profile", "Access to the user's profile information."), (Scopes.Email, "Email", "Access to the user's email address."), (Scopes.Roles, "Roles", "Access to the user's role membership."), (Scopes.OpenId, "OpenId", "Required OpenID Connect subject access."), (Scopes.OfflineAccess, "Offline access", "Access to refresh tokens.")]; + + foreach ((string name, string displayName, string description) in defaultScopes) { + if (await scopeManager.FindByNameAsync(name, cancellationToken) is null) { + Logger.LogInformation($"Creating default scope {name}."); + await scopeManager.CreateAsync(new OpenIddictScopeDescriptor { Name = name, DisplayName = displayName, Description = description }, cancellationToken); + } + } + } - if (this._options.SeedDefaultScopes == false) - { - this._logger.LogInformation("Default scope seeding is disabled."); - return; + Logger.LogWarning("Database initialization complete."); } - - IOpenIddictScopeManager scopeManager = scope.ServiceProvider.GetRequiredService(); - (string Name, string DisplayName, string Description)[] defaultScopes = - { - (Scopes.Profile, "Profile", "Access to the user's profile information."), - (Scopes.Email, "Email", "Access to the user's email address."), - (Scopes.Roles, "Roles", "Access to the user's role membership."), - (Scopes.OpenId, "OpenId", "Required OpenID Connect subject access."), - (Scopes.OfflineAccess, "Offline access", "Access to refresh tokens.") - }; - - foreach ((string name, string displayName, string description) in defaultScopes) - { - if (await scopeManager.FindByNameAsync(name, cancellationToken) is null) - { - this._logger.LogInformation("Creating default scope {ScopeName}.", name); - await scopeManager.CreateAsync(new OpenIddictScopeDescriptor - { - Name = name, - DisplayName = displayName, - Description = description - }, cancellationToken); - } + catch (Exception ex) { + Logger.LogError(new Exception("An error occurred during database initialization.", ex)); + throw; } - - this._logger.LogInformation("Database initialization complete."); } public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; From e3c1a92f4d8bc62e2fe718d1493519d61b783bba Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Tue, 14 Apr 2026 13:30:08 +0100 Subject: [PATCH 2/2] code general tidy up --- .../Oidc/OidcRequestHandler.cs | 2 +- .../ApiResourceRequestHandler.cs | 103 ++++++++++++------ .../RequestHandlers/ApiScopeRequestHandler.cs | 24 ++-- .../RequestHandlers/ClientRequestHandler.cs | 47 +++----- .../RequestHandlers/ConsentRequestHandler.cs | 19 ++-- .../RequestHandlers/GrantRequestHandler.cs | 89 ++++++--------- .../IdentityResourceRequestHandler.cs | 20 ++-- .../RequestHandlers/LoginRequestHandler.cs | 10 +- .../RequestHandlers/RoleRequestHandler.cs | 12 +- .../RequestHandlers/UserRequestHandler.cs | 2 +- .../RequestHandlers/VerifyRequestHandler.cs | 41 ++++--- .../Requests/SecurityServiceCommands.cs | 78 +++++++------ .../Requests/SecurityServiceQueries.cs | 28 ++--- SecurityService.Database/Class1.cs | 6 - .../{ => Entities}/ApplicationUser.cs | 2 +- SecurityService.Models/ApiResourceDetails.cs | 7 ++ SecurityService.Models/ApiScopeDetails.cs | 5 + ...{Class1.cs => ChangeUserPasswordResult.cs} | 2 +- SecurityService.Models/ClientDetails.cs | 13 +++ SecurityService.Models/DetailsModels.cs | 53 --------- .../ExternalProviderDetails.cs | 3 + SecurityService.Models/GrantDetails.cs | 11 +- .../IdentityResourceDetails.cs | 9 ++ SecurityService.Models/OperationResult.cs | 56 ---------- SecurityService.Models/RoleDetails.cs | 4 + SecurityService.Models/UserDetails.cs | 12 ++ .../Infrastructure/IdentityMocks.cs | 2 +- .../TestServiceProviderFactory.cs | 2 +- .../Pages/ConfirmEmailPageModelTests.cs | 2 +- .../Pages/ForgotPasswordPageModelTests.cs | 2 +- .../Pages/GrantsPageModelTests.cs | 2 +- .../Pages/ResetPasswordPageModelTests.cs | 1 - .../UserRequestHandlerTests.cs | 1 - .../VerifyRequestHandlerTests.cs | 2 +- .../{Oidc => Endpoints}/OidcEndpoints.cs | 2 +- .../Handlers/ApiResourceHandler.cs | 17 +-- SecurityService/Handlers/ApiScopeHandler.cs | 21 ++-- SecurityService/Handlers/AuthorizeHandler.cs | 19 ++++ SecurityService/Handlers/ClientHandler.cs | 31 ++++-- .../Handlers/IdentityResourceHandler.cs | 36 +++--- SecurityService/Handlers/LogoutHandler.cs | 19 ++++ SecurityService/Handlers/RoleHandler.cs | 28 ++++- SecurityService/Handlers/TokenHandler.cs | 19 ++++ SecurityService/Handlers/UserHandler.cs | 40 ++++--- SecurityService/Handlers/UserInfoHandler.cs | 19 ++++ .../Oidc/Handlers/AuthorizeHandler.cs | 11 -- .../Oidc/Handlers/LogoutHandler.cs | 11 -- SecurityService/Oidc/Handlers/TokenHandler.cs | 11 -- .../Oidc/Handlers/UserInfoHandler.cs | 11 -- .../Pages/Account/Grants/Index.cshtml.cs | 2 +- SecurityService/Pages/_ViewImports.cshtml | 4 +- SecurityService/Program.cs | 3 +- .../Controllers/HomeController.cs | 7 -- 53 files changed, 492 insertions(+), 491 deletions(-) delete mode 100644 SecurityService.Database/Class1.cs rename SecurityService.Database/{ => Entities}/ApplicationUser.cs (86%) create mode 100644 SecurityService.Models/ApiResourceDetails.cs create mode 100644 SecurityService.Models/ApiScopeDetails.cs rename SecurityService.Models/{Class1.cs => ChangeUserPasswordResult.cs} (98%) create mode 100644 SecurityService.Models/ClientDetails.cs delete mode 100644 SecurityService.Models/DetailsModels.cs create mode 100644 SecurityService.Models/ExternalProviderDetails.cs create mode 100644 SecurityService.Models/IdentityResourceDetails.cs delete mode 100644 SecurityService.Models/OperationResult.cs create mode 100644 SecurityService.Models/RoleDetails.cs create mode 100644 SecurityService.Models/UserDetails.cs rename SecurityService/{Oidc => Endpoints}/OidcEndpoints.cs (94%) create mode 100644 SecurityService/Handlers/AuthorizeHandler.cs create mode 100644 SecurityService/Handlers/LogoutHandler.cs create mode 100644 SecurityService/Handlers/TokenHandler.cs create mode 100644 SecurityService/Handlers/UserInfoHandler.cs delete mode 100644 SecurityService/Oidc/Handlers/AuthorizeHandler.cs delete mode 100644 SecurityService/Oidc/Handlers/LogoutHandler.cs delete mode 100644 SecurityService/Oidc/Handlers/TokenHandler.cs delete mode 100644 SecurityService/Oidc/Handlers/UserInfoHandler.cs diff --git a/SecurityService.BusinessLogic/Oidc/OidcRequestHandler.cs b/SecurityService.BusinessLogic/Oidc/OidcRequestHandler.cs index bb967483..1777d8fa 100644 --- a/SecurityService.BusinessLogic/Oidc/OidcRequestHandler.cs +++ b/SecurityService.BusinessLogic/Oidc/OidcRequestHandler.cs @@ -10,8 +10,8 @@ using OpenIddict.Abstractions; using OpenIddict.Server.AspNetCore; using OpenIddict.Validation.AspNetCore; -using SecurityService.Database; using SecurityService.Database.DbContexts; +using SecurityService.Database.Entities; using SimpleResults; using static OpenIddict.Abstractions.OpenIddictConstants; diff --git a/SecurityService.BusinessLogic/RequestHandlers/ApiResourceRequestHandler.cs b/SecurityService.BusinessLogic/RequestHandlers/ApiResourceRequestHandler.cs index 92353c7c..c3dbbf44 100644 --- a/SecurityService.BusinessLogic/RequestHandlers/ApiResourceRequestHandler.cs +++ b/SecurityService.BusinessLogic/RequestHandlers/ApiResourceRequestHandler.cs @@ -18,52 +18,40 @@ public sealed class ApiResourceRequestHandler : IRequestHandler>, IRequestHandler>> { - private readonly SecurityServiceDbContext _dbContext; - private readonly IOpenIddictScopeManager _scopeManager; + private readonly SecurityServiceDbContext DbContext; + private readonly IOpenIddictScopeManager ScopeManager; public ApiResourceRequestHandler(SecurityServiceDbContext dbContext, IOpenIddictScopeManager scopeManager) { - this._dbContext = dbContext; - this._scopeManager = scopeManager; + this.DbContext = dbContext; + this.ScopeManager = scopeManager; } public async Task Handle(SecurityServiceCommands.CreateApiResourceCommand command, CancellationToken cancellationToken) { - if (string.IsNullOrWhiteSpace(command.Name)) - { + if (string.IsNullOrWhiteSpace(command.Name)) { return Result.Invalid("API resource name is required."); } - if (await this._dbContext.ResourceDefinitions.AnyAsync(resource => resource.Name == command.Name && resource.Type == ResourceType.ApiResource, cancellationToken)) - { + if (await this.DbContext.ResourceDefinitions.AnyAsync(resource => resource.Name == command.Name && resource.Type == ResourceType.ApiResource, cancellationToken)) { return Result.Conflict($"An API resource named '{command.Name}' already exists."); } - foreach (var scopeName in command.Scopes.Distinct(StringComparer.OrdinalIgnoreCase)) - { - var scope = await this._scopeManager.FindByNameAsync(scopeName, cancellationToken); - if (scope is null) - { - this._scopeManager.CreateAsync(new OpenIddictScopeDescriptor - { - Name = scopeName, - DisplayName = scopeName, - Description = $"Auto-created scope for API resource '{command.Name}'." - }, cancellationToken).GetAwaiter().GetResult(); - scope = await this._scopeManager.FindByNameAsync(scopeName, cancellationToken); + foreach (String scopeName in command.Scopes.Distinct(StringComparer.OrdinalIgnoreCase)) { + Object? scope = await this.ScopeManager.FindByNameAsync(scopeName, cancellationToken); + if (scope is null) { + scope = await this.ScopeManager.CreateAsync(new OpenIddictScopeDescriptor { Name = scopeName, DisplayName = scopeName, Description = $"Auto-created scope for API resource '{command.Name}'." }, cancellationToken); } - var descriptor = new OpenIddictScopeDescriptor(); - await this._scopeManager.PopulateAsync(descriptor, scope, cancellationToken); - if (descriptor.Resources.Contains(command.Name, StringComparer.OrdinalIgnoreCase) == false) - { + OpenIddictScopeDescriptor descriptor = new(); + await this.ScopeManager.PopulateAsync(descriptor, scope, cancellationToken); + if (descriptor.Resources.Contains(command.Name, StringComparer.OrdinalIgnoreCase) == false) { descriptor.Resources.Add(command.Name); - await this._scopeManager.UpdateAsync(scope, descriptor, cancellationToken); + await this.ScopeManager.UpdateAsync(scope, descriptor, cancellationToken); } } - var resource = new ResourceDefinition - { + ResourceDefinition resource = new() { Id = Guid.NewGuid(), Name = command.Name, DisplayName = command.DisplayName, @@ -74,23 +62,68 @@ public async Task Handle(SecurityServiceCommands.CreateApiResourceComman ScopesJson = JsonListSerializer.Serialize(command.Scopes) }; - this._dbContext.ResourceDefinitions.Add(resource); - await this._dbContext.SaveChangesAsync(cancellationToken); + await this.DbContext.ResourceDefinitions.AddAsync(resource, cancellationToken); + await this.DbContext.SaveChangesAsync(cancellationToken); return Result.Success(); } public async Task> Handle(SecurityServiceQueries.GetApiResourceQuery query, CancellationToken cancellationToken) { - var resource = await this._dbContext.ResourceDefinitions.SingleOrDefaultAsync(definition => definition.Name == query.Name && definition.Type == ResourceType.ApiResource, cancellationToken); - return resource is null - ? Result.NotFound($"No API resource named '{query.Name}' was found.") - : Result.Success(new ApiResourceDetails(resource.Name, resource.DisplayName, resource.Description, JsonListSerializer.Deserialize(resource.ScopesJson), JsonListSerializer.Deserialize(resource.ClaimsJson))); + ResourceDefinition? resource = await this.DbContext.ResourceDefinitions.SingleOrDefaultAsync(definition => definition.Name == query.Name && definition.Type == ResourceType.ApiResource, cancellationToken); + return resource switch { + null => Result.NotFound($"No API resource named '{query.Name}' was found."), + _ => Result.Success(Factory.ConvertFrom(resource)) + }; } public async Task>> Handle(SecurityServiceQueries.GetApiResourcesQuery query, CancellationToken cancellationToken) { - var resources = await this._dbContext.ResourceDefinitions.Where(definition => definition.Type == ResourceType.ApiResource).OrderBy(definition => definition.Name).ToListAsync(cancellationToken); - return Result.Success(resources.Select(resource => new ApiResourceDetails(resource.Name, resource.DisplayName, resource.Description, JsonListSerializer.Deserialize(resource.ScopesJson), JsonListSerializer.Deserialize(resource.ClaimsJson))).ToList()); + List resources = await this.DbContext.ResourceDefinitions.Where(definition => definition.Type == ResourceType.ApiResource).OrderBy(definition => definition.Name).ToListAsync(cancellationToken); + return Result.Success(Factory.ConvertFrom(resources)); } } + + +public static class Factory +{ + public static ApiResourceDetails ConvertFrom(ResourceDefinition resource) { + return new ApiResourceDetails(resource.Name, resource.DisplayName, resource.Description, JsonListSerializer.Deserialize(resource.ScopesJson), JsonListSerializer.Deserialize(resource.ClaimsJson)); + } + + public static List ConvertFrom(List resources) + { + List results = new(); + foreach (ResourceDefinition resource in resources) { + results.Add(ConvertFrom(resource)); + } + return results; + } + + public static ApiScopeDetails ConvertFrom(String name, String displayName, String description) + { + return new ApiScopeDetails(name, displayName, description); + } + + public static List ConvertFrom(List<(String name, String displayName, String description)> resources) { + List results = new(); + foreach ((String name, String displayName, String description) resource in resources) + { + results.Add(ConvertFrom(resource.name, resource.displayName, resource.description)); + } + return results; + } + + public static ClientDetails ConvertFrom(ClientDefinition definition) => new( + definition.ClientId, + definition.ClientName, + definition.Description, + definition.ClientUri, + JsonListSerializer.Deserialize(definition.AllowedScopesJson), + JsonListSerializer.Deserialize(definition.AllowedGrantTypesJson), + JsonListSerializer.Deserialize(definition.RedirectUrisJson), + JsonListSerializer.Deserialize(definition.PostLogoutRedirectUrisJson), + definition.RequireConsent, + definition.AllowOfflineAccess, + definition.ClientType); +} \ No newline at end of file diff --git a/SecurityService.BusinessLogic/RequestHandlers/ApiScopeRequestHandler.cs b/SecurityService.BusinessLogic/RequestHandlers/ApiScopeRequestHandler.cs index d7cdc487..71422294 100644 --- a/SecurityService.BusinessLogic/RequestHandlers/ApiScopeRequestHandler.cs +++ b/SecurityService.BusinessLogic/RequestHandlers/ApiScopeRequestHandler.cs @@ -15,13 +15,13 @@ public sealed class ApiScopeRequestHandler : IRequestHandler>, IRequestHandler>> { - private readonly SecurityServiceDbContext _dbContext; - private readonly IOpenIddictScopeManager _scopeManager; + private readonly SecurityServiceDbContext DbContext; + private readonly IOpenIddictScopeManager ScopeManager; public ApiScopeRequestHandler(SecurityServiceDbContext dbContext, IOpenIddictScopeManager scopeManager) { - this._dbContext = dbContext; - this._scopeManager = scopeManager; + this.DbContext = dbContext; + this.ScopeManager = scopeManager; } public async Task Handle(SecurityServiceCommands.CreateApiScopeCommand command, CancellationToken cancellationToken) @@ -31,7 +31,7 @@ public async Task Handle(SecurityServiceCommands.CreateApiScopeCommand c return Result.Invalid("Scope name is required."); } - if (await this._dbContext.ResourceDefinitions.AnyAsync(resource => resource.Name == command.Name && resource.Type == ResourceType.ApiScope, cancellationToken)) + if (await this.DbContext.ResourceDefinitions.AnyAsync(resource => resource.Name == command.Name && resource.Type == ResourceType.ApiScope, cancellationToken)) { return Result.Conflict($"An API scope named '{command.Name}' already exists."); } @@ -43,7 +43,7 @@ public async Task Handle(SecurityServiceCommands.CreateApiScopeCommand c Description = command.Description }; - await this._scopeManager.CreateAsync(descriptor, cancellationToken); + await this.ScopeManager.CreateAsync(descriptor, cancellationToken); var resource = new ResourceDefinition { @@ -54,23 +54,23 @@ public async Task Handle(SecurityServiceCommands.CreateApiScopeCommand c Type = ResourceType.ApiScope }; - this._dbContext.ResourceDefinitions.Add(resource); - await this._dbContext.SaveChangesAsync(cancellationToken); + await this.DbContext.ResourceDefinitions.AddAsync(resource, cancellationToken); + await this.DbContext.SaveChangesAsync(cancellationToken); return Result.Success(); } public async Task> Handle(SecurityServiceQueries.GetApiScopeQuery query, CancellationToken cancellationToken) { - var resource = await this._dbContext.ResourceDefinitions.SingleOrDefaultAsync(definition => definition.Name == query.Name && definition.Type == ResourceType.ApiScope, cancellationToken); + var resource = await this.DbContext.ResourceDefinitions.SingleOrDefaultAsync(definition => definition.Name == query.Name && definition.Type == ResourceType.ApiScope, cancellationToken); return resource is null ? Result.NotFound($"No API scope named '{query.Name}' was found.") - : Result.Success(new ApiScopeDetails(resource.Name, resource.DisplayName, resource.Description)); + : Result.Success(Factory.ConvertFrom(resource.Name, resource.DisplayName, resource.Description)); } public async Task>> Handle(SecurityServiceQueries.GetApiScopesQuery query, CancellationToken cancellationToken) { - var scopes = await this._dbContext.ResourceDefinitions.Where(definition => definition.Type == ResourceType.ApiScope).OrderBy(definition => definition.Name).Select(definition => new ApiScopeDetails(definition.Name, definition.DisplayName, definition.Description)).ToArrayAsync(cancellationToken); - return Result.Success(scopes.ToList()); + var scopes = await this.DbContext.ResourceDefinitions.Where(definition => definition.Type == ResourceType.ApiScope).OrderBy(definition => definition.Name).ToListAsync(cancellationToken); + return Result.Success(Factory.ConvertFrom(scopes.Select(definition => (definition.Name, definition.DisplayName, definition.Description)).ToList())); } } diff --git a/SecurityService.BusinessLogic/RequestHandlers/ClientRequestHandler.cs b/SecurityService.BusinessLogic/RequestHandlers/ClientRequestHandler.cs index 26c0ac70..b00f6ff1 100644 --- a/SecurityService.BusinessLogic/RequestHandlers/ClientRequestHandler.cs +++ b/SecurityService.BusinessLogic/RequestHandlers/ClientRequestHandler.cs @@ -29,13 +29,13 @@ public sealed class ClientRequestHandler : GrantTypes.RefreshToken }; - private readonly SecurityServiceDbContext _dbContext; - private readonly IOpenIddictApplicationManager _applicationManager; + private readonly SecurityServiceDbContext DbContext; + private readonly IOpenIddictApplicationManager ApplicationManager; public ClientRequestHandler(SecurityServiceDbContext dbContext, IOpenIddictApplicationManager applicationManager) { - this._dbContext = dbContext; - this._applicationManager = applicationManager; + this.DbContext = dbContext; + this.ApplicationManager = applicationManager; } public async Task Handle(SecurityServiceCommands.CreateClientCommand command, CancellationToken cancellationToken) @@ -50,18 +50,18 @@ public async Task Handle(SecurityServiceCommands.CreateClientCommand com return Result.Invalid("At least one grant type is required."); } - var invalidGrantTypes = command.AllowedGrantTypes.Where(grantType => SupportedGrantTypes.Contains(grantType) == false).Distinct(StringComparer.OrdinalIgnoreCase).ToArray(); + String[] invalidGrantTypes = command.AllowedGrantTypes.Where(grantType => SupportedGrantTypes.Contains(grantType) == false).Distinct(StringComparer.OrdinalIgnoreCase).ToArray(); if (invalidGrantTypes.Length > 0) { return Result.Invalid($"Unsupported grant types: {string.Join(", ", invalidGrantTypes)}."); } - if (await this._dbContext.ClientDefinitions.AnyAsync(client => client.ClientId == command.ClientId, cancellationToken)) + if (await this.DbContext.ClientDefinitions.AnyAsync(client => client.ClientId == command.ClientId, cancellationToken)) { return Result.Conflict($"A client with id '{command.ClientId}' already exists."); } - var descriptor = new OpenIddictApplicationDescriptor + OpenIddictApplicationDescriptor descriptor = new OpenIddictApplicationDescriptor { ClientId = command.ClientId, DisplayName = command.ClientName, @@ -70,19 +70,19 @@ public async Task Handle(SecurityServiceCommands.CreateClientCommand com ClientSecret = string.IsNullOrWhiteSpace(command.Secret) ? null : command.Secret }; - foreach (var redirectUri in command.ClientRedirectUris.Where(uri => string.IsNullOrWhiteSpace(uri) == false).Distinct(StringComparer.OrdinalIgnoreCase)) + foreach (String redirectUri in command.ClientRedirectUris.Where(uri => string.IsNullOrWhiteSpace(uri) == false).Distinct(StringComparer.OrdinalIgnoreCase)) { descriptor.RedirectUris.Add(new Uri(redirectUri, UriKind.Absolute)); } - foreach (var postLogoutRedirectUri in command.ClientPostLogoutRedirectUris.Where(uri => string.IsNullOrWhiteSpace(uri) == false).Distinct(StringComparer.OrdinalIgnoreCase)) + foreach (String postLogoutRedirectUri in command.ClientPostLogoutRedirectUris.Where(uri => string.IsNullOrWhiteSpace(uri) == false).Distinct(StringComparer.OrdinalIgnoreCase)) { descriptor.PostLogoutRedirectUris.Add(new Uri(postLogoutRedirectUri, UriKind.Absolute)); } - await this._applicationManager.CreateAsync(descriptor, cancellationToken); + await this.ApplicationManager.CreateAsync(descriptor, cancellationToken); - var definition = new ClientDefinition + ClientDefinition definition = new ClientDefinition { Id = Guid.NewGuid(), ClientId = command.ClientId, @@ -99,36 +99,25 @@ public async Task Handle(SecurityServiceCommands.CreateClientCommand com ClientType = descriptor.ClientType }; - this._dbContext.ClientDefinitions.Add(definition); - await this._dbContext.SaveChangesAsync(cancellationToken); + await this.DbContext.ClientDefinitions.AddAsync(definition, cancellationToken); + await this.DbContext.SaveChangesAsync(cancellationToken); return Result.Success(); } public async Task> Handle(SecurityServiceQueries.GetClientQuery query, CancellationToken cancellationToken) { - var definition = await this._dbContext.ClientDefinitions.SingleOrDefaultAsync(client => client.ClientId == query.ClientId, cancellationToken); + ClientDefinition? definition = await this.DbContext.ClientDefinitions.SingleOrDefaultAsync(client => client.ClientId == query.ClientId, cancellationToken); return definition is null ? Result.NotFound($"No client found with id '{query.ClientId}'.") - : Result.Success(Map(definition)); + : Result.Success(Factory.ConvertFrom(definition)); } public async Task>> Handle(SecurityServiceQueries.GetClientsQuery query, CancellationToken cancellationToken) { - var definitions = await this._dbContext.ClientDefinitions.OrderBy(client => client.ClientId).ToListAsync(cancellationToken); - return Result.Success(definitions.Select(Map).ToList()); + List definitions = await this.DbContext.ClientDefinitions.OrderBy(client => client.ClientId).ToListAsync(cancellationToken); + return Result.Success(definitions.Select(Factory.ConvertFrom).ToList()); } - private static ClientDetails Map(ClientDefinition definition) => new( - definition.ClientId, - definition.ClientName, - definition.Description, - definition.ClientUri, - JsonListSerializer.Deserialize(definition.AllowedScopesJson), - JsonListSerializer.Deserialize(definition.AllowedGrantTypesJson), - JsonListSerializer.Deserialize(definition.RedirectUrisJson), - JsonListSerializer.Deserialize(definition.PostLogoutRedirectUrisJson), - definition.RequireConsent, - definition.AllowOfflineAccess, - definition.ClientType); + } diff --git a/SecurityService.BusinessLogic/RequestHandlers/ConsentRequestHandler.cs b/SecurityService.BusinessLogic/RequestHandlers/ConsentRequestHandler.cs index 5af6d55e..297155d1 100644 --- a/SecurityService.BusinessLogic/RequestHandlers/ConsentRequestHandler.cs +++ b/SecurityService.BusinessLogic/RequestHandlers/ConsentRequestHandler.cs @@ -12,15 +12,14 @@ public sealed class ConsentRequestHandler : IRequestHandler>, IRequestHandler> { - private readonly IOpenIddictApplicationManager _applicationManager; - private readonly SecurityServiceDbContext _dbContext; + private readonly IOpenIddictApplicationManager ApplicationManager; + private readonly SecurityServiceDbContext DbContext; - public ConsentRequestHandler( - IOpenIddictApplicationManager applicationManager, - SecurityServiceDbContext dbContext) + public ConsentRequestHandler(IOpenIddictApplicationManager applicationManager, + SecurityServiceDbContext dbContext) { - this._applicationManager = applicationManager; - this._dbContext = dbContext; + this.ApplicationManager = applicationManager; + this.DbContext = dbContext; } public async Task> Handle(OidcCommands.ConsentGetQuery query, CancellationToken cancellationToken) @@ -31,12 +30,12 @@ public async Task> Handle(OidcCommands.ConsentGetQ return Result.Success(new ConsentGetLocalRedirectResult(query.ReturnUrl)); } - var application = await this._applicationManager.FindByClientIdAsync(request.ClientId!, cancellationToken); + var application = await this.ApplicationManager.FindByClientIdAsync(request.ClientId!, cancellationToken); var clientName = application is null ? request.ClientId! - : await this._applicationManager.GetDisplayNameAsync(application, cancellationToken) ?? request.ClientId!; + : await this.ApplicationManager.GetDisplayNameAsync(application, cancellationToken) ?? request.ClientId!; - var scopes = await OidcHelpers.BuildScopeDisplay(request, this._dbContext, cancellationToken); + var scopes = await OidcHelpers.BuildScopeDisplay(request, this.DbContext, cancellationToken); return Result.Success(new ConsentGetPageResult(clientName, scopes.IdentityScopes, scopes.ApiScopes)); } diff --git a/SecurityService.BusinessLogic/RequestHandlers/GrantRequestHandler.cs b/SecurityService.BusinessLogic/RequestHandlers/GrantRequestHandler.cs index febfd2b5..918220af 100644 --- a/SecurityService.BusinessLogic/RequestHandlers/GrantRequestHandler.cs +++ b/SecurityService.BusinessLogic/RequestHandlers/GrantRequestHandler.cs @@ -7,94 +7,75 @@ namespace SecurityService.BusinessLogic.RequestHandlers; -public sealed class GrantRequestHandler : - IRequestHandler>>, - IRequestHandler -{ - private readonly IOpenIddictAuthorizationManager _authorizationManager; - private readonly IOpenIddictApplicationManager _applicationManager; - - public GrantRequestHandler(IOpenIddictAuthorizationManager authorizationManager, IOpenIddictApplicationManager applicationManager) - { - this._authorizationManager = authorizationManager; - this._applicationManager = applicationManager; +public sealed class GrantRequestHandler : IRequestHandler>>, + IRequestHandler { + private readonly IOpenIddictAuthorizationManager AuthorizationManager; + private readonly IOpenIddictApplicationManager ApplicationManager; + + public GrantRequestHandler(IOpenIddictAuthorizationManager authorizationManager, + IOpenIddictApplicationManager applicationManager) { + this.AuthorizationManager = authorizationManager; + this.ApplicationManager = applicationManager; } - public async Task>> Handle(SecurityServiceQueries.GetUserGrantsQuery query, CancellationToken cancellationToken) - { - var authorizations = await this._authorizationManager.FindAsync(query.UserId, client: null, status: Statuses.Valid, type: null, scopes: null, cancellationToken).ToListAsync(cancellationToken); + public async Task>> Handle(SecurityServiceQueries.GetUserGrantsQuery query, + CancellationToken cancellationToken) { + var authorizations = await this.AuthorizationManager.FindAsync(query.UserId, client: null, status: Statuses.Valid, type: null, scopes: null, cancellationToken).ToListAsync(cancellationToken); var grants = new List(); - foreach (var authorization in authorizations) - { + foreach (var authorization in authorizations) { var grant = await this.BuildGrantDetailsAsync(authorization, cancellationToken); - if (grant is not null) - { + if (grant is not null) { grants.Add(grant); } } - var sorted = grants - .OrderByDescending(grant => grant.CreatedAt) - .ThenBy(grant => grant.DisplayName, StringComparer.OrdinalIgnoreCase) - .ToList(); + var sorted = grants.OrderByDescending(grant => grant.CreatedAt).ThenBy(grant => grant.DisplayName, StringComparer.OrdinalIgnoreCase).ToList(); return Result.Success(sorted); } - private async Task BuildGrantDetailsAsync(object authorization, CancellationToken cancellationToken) - { - var authorizationId = await this._authorizationManager.GetIdAsync(authorization, cancellationToken); - if (string.IsNullOrWhiteSpace(authorizationId)) - { + private async Task BuildGrantDetailsAsync(object authorization, + CancellationToken cancellationToken) { + var authorizationId = await this.AuthorizationManager.GetIdAsync(authorization, cancellationToken); + if (string.IsNullOrWhiteSpace(authorizationId)) { return null; } - var applicationId = await this._authorizationManager.GetApplicationIdAsync(authorization, cancellationToken); + var applicationId = await this.AuthorizationManager.GetApplicationIdAsync(authorization, cancellationToken); var (clientId, displayName) = await this.GetApplicationDisplayAsync(applicationId, cancellationToken); - return new GrantDetails( - authorizationId, - clientId, - displayName, - await this._authorizationManager.GetScopesAsync(authorization, cancellationToken), - await this._authorizationManager.GetCreationDateAsync(authorization, cancellationToken)); + return new GrantDetails(authorizationId, clientId, displayName, await this.AuthorizationManager.GetScopesAsync(authorization, cancellationToken), await this.AuthorizationManager.GetCreationDateAsync(authorization, cancellationToken)); } - private async Task<(string clientId, string displayName)> GetApplicationDisplayAsync(string? applicationId, CancellationToken cancellationToken) - { - if (string.IsNullOrWhiteSpace(applicationId)) - { + private async Task<(string clientId, string displayName)> GetApplicationDisplayAsync(string? applicationId, + CancellationToken cancellationToken) { + if (string.IsNullOrWhiteSpace(applicationId)) { return (string.Empty, string.Empty); } - var application = await this._applicationManager.FindByIdAsync(applicationId, cancellationToken); - if (application is null) - { + var application = await this.ApplicationManager.FindByIdAsync(applicationId, cancellationToken); + if (application is null) { return (string.Empty, string.Empty); } - var clientId = await this._applicationManager.GetClientIdAsync(application, cancellationToken) ?? string.Empty; - var displayName = await this._applicationManager.GetDisplayNameAsync(application, cancellationToken) ?? clientId; + var clientId = await this.ApplicationManager.GetClientIdAsync(application, cancellationToken) ?? string.Empty; + var displayName = await this.ApplicationManager.GetDisplayNameAsync(application, cancellationToken) ?? clientId; return (clientId, string.IsNullOrWhiteSpace(displayName) ? clientId : displayName); } - public async Task Handle(SecurityServiceCommands.RevokeGrantCommand command, CancellationToken cancellationToken) - { - var authorization = await this._authorizationManager.FindByIdAsync(command.AuthorizationId, cancellationToken); - if (authorization is null) - { + public async Task Handle(SecurityServiceCommands.RevokeGrantCommand command, + CancellationToken cancellationToken) { + var authorization = await this.AuthorizationManager.FindByIdAsync(command.AuthorizationId, cancellationToken); + if (authorization is null) { return Result.NotFound($"No authorization found with id '{command.AuthorizationId}'."); } - var subject = await this._authorizationManager.GetSubjectAsync(authorization, cancellationToken); - if (string.Equals(subject, command.UserId, StringComparison.Ordinal) == false) - { + var subject = await this.AuthorizationManager.GetSubjectAsync(authorization, cancellationToken); + if (string.Equals(subject, command.UserId, StringComparison.Ordinal) == false) { return Result.NotFound($"No authorization found with id '{command.AuthorizationId}'."); } - return await this._authorizationManager.TryRevokeAsync(authorization, cancellationToken) - ? Result.Success() - : Result.Failure("The authorization could not be revoked."); + return await this.AuthorizationManager.TryRevokeAsync(authorization, cancellationToken) ? Result.Success() : Result.Failure("The authorization could not be revoked."); } } diff --git a/SecurityService.BusinessLogic/RequestHandlers/IdentityResourceRequestHandler.cs b/SecurityService.BusinessLogic/RequestHandlers/IdentityResourceRequestHandler.cs index 46477fb6..bd05ba28 100644 --- a/SecurityService.BusinessLogic/RequestHandlers/IdentityResourceRequestHandler.cs +++ b/SecurityService.BusinessLogic/RequestHandlers/IdentityResourceRequestHandler.cs @@ -16,13 +16,13 @@ public sealed class IdentityResourceRequestHandler : IRequestHandler>, IRequestHandler>> { - private readonly SecurityServiceDbContext _dbContext; - private readonly IOpenIddictScopeManager _scopeManager; + private readonly SecurityServiceDbContext DbContext; + private readonly IOpenIddictScopeManager ScopeManager; public IdentityResourceRequestHandler(SecurityServiceDbContext dbContext, IOpenIddictScopeManager scopeManager) { - this._dbContext = dbContext; - this._scopeManager = scopeManager; + this.DbContext = dbContext; + this.ScopeManager = scopeManager; } public async Task Handle(SecurityServiceCommands.CreateIdentityResourceCommand command, CancellationToken cancellationToken) @@ -32,7 +32,7 @@ public async Task Handle(SecurityServiceCommands.CreateIdentityResourceC return Result.Failure("Identity resource name is required."); } - if (await this._dbContext.ResourceDefinitions.AnyAsync(resource => resource.Name == command.Name && resource.Type == ResourceType.IdentityResource, cancellationToken)) + if (await this.DbContext.ResourceDefinitions.AnyAsync(resource => resource.Name == command.Name && resource.Type == ResourceType.IdentityResource, cancellationToken)) { return Result.Conflict($"An identity resource named '{command.Name}' already exists."); } @@ -44,7 +44,7 @@ public async Task Handle(SecurityServiceCommands.CreateIdentityResourceC Description = command.Description }; - await this._scopeManager.CreateAsync(descriptor, cancellationToken); + await this.ScopeManager.CreateAsync(descriptor, cancellationToken); var resource = new ResourceDefinition { @@ -59,15 +59,15 @@ public async Task Handle(SecurityServiceCommands.CreateIdentityResourceC ClaimsJson = JsonListSerializer.Serialize(command.Claims) }; - this._dbContext.ResourceDefinitions.Add(resource); - await this._dbContext.SaveChangesAsync(cancellationToken); + await this.DbContext.ResourceDefinitions.AddAsync(resource, cancellationToken); + await this.DbContext.SaveChangesAsync(cancellationToken); return Result.Success(); } public async Task> Handle(SecurityServiceQueries.GetIdentityResourceQuery query, CancellationToken cancellationToken) { - var resource = await this._dbContext.ResourceDefinitions.SingleOrDefaultAsync(definition => definition.Name == query.Name && definition.Type == ResourceType.IdentityResource, cancellationToken); + var resource = await this.DbContext.ResourceDefinitions.SingleOrDefaultAsync(definition => definition.Name == query.Name && definition.Type == ResourceType.IdentityResource, cancellationToken); return resource is null ? Result.NotFound($"No identity resource named '{query.Name}' was found.") : Result.Success(new IdentityResourceDetails(resource.Name, resource.DisplayName, resource.Description, resource.Required, resource.Emphasize, resource.ShowInDiscoveryDocument, JsonListSerializer.Deserialize(resource.ClaimsJson))); @@ -75,7 +75,7 @@ public async Task> Handle(SecurityServiceQueries public async Task>> Handle(SecurityServiceQueries.GetIdentityResourcesQuery query, CancellationToken cancellationToken) { - var resources = await this._dbContext.ResourceDefinitions.Where(definition => definition.Type == ResourceType.IdentityResource).OrderBy(definition => definition.Name).ToListAsync(cancellationToken); + var resources = await this.DbContext.ResourceDefinitions.Where(definition => definition.Type == ResourceType.IdentityResource).OrderBy(definition => definition.Name).ToListAsync(cancellationToken); return Result.Success(resources.Select(resource => new IdentityResourceDetails(resource.Name, resource.DisplayName, resource.Description, resource.Required, resource.Emphasize, resource.ShowInDiscoveryDocument, JsonListSerializer.Deserialize(resource.ClaimsJson))).ToList()); } } diff --git a/SecurityService.BusinessLogic/RequestHandlers/LoginRequestHandler.cs b/SecurityService.BusinessLogic/RequestHandlers/LoginRequestHandler.cs index 33e8af70..a0e3d51a 100644 --- a/SecurityService.BusinessLogic/RequestHandlers/LoginRequestHandler.cs +++ b/SecurityService.BusinessLogic/RequestHandlers/LoginRequestHandler.cs @@ -1,7 +1,7 @@ using MediatR; using Microsoft.AspNetCore.Identity; using SecurityService.BusinessLogic.Requests; -using SecurityService.Database; +using SecurityService.Database.Entities; using SecurityService.Models; using SimpleResults; @@ -11,16 +11,16 @@ public sealed class LoginRequestHandler : IRequestHandler>>, IRequestHandler { - private readonly SignInManager _signInManager; + private readonly SignInManager SignInManager; public LoginRequestHandler(SignInManager signInManager) { - this._signInManager = signInManager; + this.SignInManager = signInManager; } public async Task>> Handle(SecurityServiceQueries.GetExternalProvidersQuery query, CancellationToken cancellationToken) { - var providers = (await this._signInManager.GetExternalAuthenticationSchemesAsync()) + var providers = (await this.SignInManager.GetExternalAuthenticationSchemesAsync()) .Select(scheme => new ExternalProviderDetails(scheme.Name, scheme.DisplayName ?? scheme.Name)) .OrderBy(provider => provider.DisplayName, StringComparer.OrdinalIgnoreCase) .ToList(); @@ -30,7 +30,7 @@ public async Task>> Handle(SecurityServiceQ public async Task Handle(SecurityServiceCommands.LoginCommand command, CancellationToken cancellationToken) { - var result = await this._signInManager.PasswordSignInAsync(command.Username, command.Password, command.RememberLogin, lockoutOnFailure: true); + var result = await this.SignInManager.PasswordSignInAsync(command.Username, command.Password, command.RememberLogin, lockoutOnFailure: true); if (result.Succeeded) { diff --git a/SecurityService.BusinessLogic/RequestHandlers/RoleRequestHandler.cs b/SecurityService.BusinessLogic/RequestHandlers/RoleRequestHandler.cs index 3c3342e9..2c369e20 100644 --- a/SecurityService.BusinessLogic/RequestHandlers/RoleRequestHandler.cs +++ b/SecurityService.BusinessLogic/RequestHandlers/RoleRequestHandler.cs @@ -12,11 +12,11 @@ public sealed class RoleRequestHandler : IRequestHandler>, IRequestHandler>> { - private readonly RoleManager _roleManager; + private readonly RoleManager RoleManager; public RoleRequestHandler(RoleManager roleManager) { - this._roleManager = roleManager; + this.RoleManager = roleManager; } public async Task Handle(SecurityServiceCommands.CreateRoleCommand command, CancellationToken cancellationToken) @@ -26,13 +26,13 @@ public async Task Handle(SecurityServiceCommands.CreateRoleCommand comma return Result.Invalid("Role name is required."); } - if (await this._roleManager.RoleExistsAsync(command.Name)) + if (await this.RoleManager.RoleExistsAsync(command.Name)) { return Result.Conflict($"A role named '{command.Name}' already exists."); } var role = new IdentityRole(command.Name); - var result = await this._roleManager.CreateAsync(role); + var result = await this.RoleManager.CreateAsync(role); if (result.Succeeded == false) { return Result.Invalid(string.Join("; ", result.Errors.Select(error => error.Description))); @@ -43,7 +43,7 @@ public async Task Handle(SecurityServiceCommands.CreateRoleCommand comma public async Task> Handle(SecurityServiceQueries.GetRoleQuery query, CancellationToken cancellationToken) { - var role = await this._roleManager.Roles.SingleOrDefaultAsync(item => item.Id == query.RoleId, cancellationToken); + var role = await this.RoleManager.Roles.SingleOrDefaultAsync(item => item.Id == query.RoleId, cancellationToken); return role is null ? Result.NotFound($"No role found with id '{query.RoleId}'.") : Result.Success(new RoleDetails(role.Id, role.Name!)); @@ -51,7 +51,7 @@ public async Task> Handle(SecurityServiceQueries.GetRoleQuer public async Task>> Handle(SecurityServiceQueries.GetRolesQuery query, CancellationToken cancellationToken) { - var roles = await this._roleManager.Roles.OrderBy(role => role.Name).Select(role => new RoleDetails(role.Id, role.Name!)).ToArrayAsync(cancellationToken); + var roles = await this.RoleManager.Roles.OrderBy(role => role.Name).Select(role => new RoleDetails(role.Id, role.Name!)).ToArrayAsync(cancellationToken); return Result.Success(roles.ToList()); } } diff --git a/SecurityService.BusinessLogic/RequestHandlers/UserRequestHandler.cs b/SecurityService.BusinessLogic/RequestHandlers/UserRequestHandler.cs index 7c8fdfe3..d2440006 100644 --- a/SecurityService.BusinessLogic/RequestHandlers/UserRequestHandler.cs +++ b/SecurityService.BusinessLogic/RequestHandlers/UserRequestHandler.cs @@ -9,8 +9,8 @@ using OpenIddict.Abstractions; using OpenIddict.Server; using SecurityService.BusinessLogic.Requests; -using SecurityService.Database; using SecurityService.Database.DbContexts; +using SecurityService.Database.Entities; using SecurityService.DataTransferObjects; using SecurityService.Models; using Shared.Results; diff --git a/SecurityService.BusinessLogic/RequestHandlers/VerifyRequestHandler.cs b/SecurityService.BusinessLogic/RequestHandlers/VerifyRequestHandler.cs index 365d1a0e..86712da5 100644 --- a/SecurityService.BusinessLogic/RequestHandlers/VerifyRequestHandler.cs +++ b/SecurityService.BusinessLogic/RequestHandlers/VerifyRequestHandler.cs @@ -6,8 +6,8 @@ using OpenIddict.Abstractions; using OpenIddict.Server.AspNetCore; using SecurityService.BusinessLogic.Oidc; -using SecurityService.Database; using SecurityService.Database.DbContexts; +using SecurityService.Database.Entities; using SimpleResults; using static OpenIddict.Abstractions.OpenIddictConstants; @@ -17,21 +17,20 @@ public sealed class VerifyRequestHandler : IRequestHandler>, IRequestHandler> { - private readonly IOpenIddictApplicationManager _applicationManager; - private readonly IOpenIddictScopeManager _scopeManager; - private readonly SecurityServiceDbContext _dbContext; - private readonly UserManager _userManager; - - public VerifyRequestHandler( - IOpenIddictApplicationManager applicationManager, - IOpenIddictScopeManager scopeManager, - SecurityServiceDbContext dbContext, - UserManager userManager) + private readonly IOpenIddictApplicationManager ApplicationManager; + private readonly IOpenIddictScopeManager ScopeManager; + private readonly SecurityServiceDbContext DbContext; + private readonly UserManager UserManager; + + public VerifyRequestHandler(IOpenIddictApplicationManager applicationManager, + IOpenIddictScopeManager scopeManager, + SecurityServiceDbContext dbContext, + UserManager userManager) { - this._applicationManager = applicationManager; - this._scopeManager = scopeManager; - this._dbContext = dbContext; - this._userManager = userManager; + this.ApplicationManager = applicationManager; + this.ScopeManager = scopeManager; + this.DbContext = dbContext; + this.UserManager = userManager; } public async Task> Handle(OidcCommands.VerifyGetQuery query, CancellationToken cancellationToken) @@ -97,7 +96,7 @@ private async Task> HandleVerifiedPostAsync(stri return Result.Success(new VerifyPostForbidResult(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme)); } - var user = await this._userManager.GetUserAsync(context.User); + var user = await this.UserManager.GetUserAsync(context.User); if (user is null) { var loginUrl = $"/Account/Login?returnUrl={Uri.EscapeDataString(OidcHelpers.BuildCurrentRequestUrl(context.Request))}"; @@ -105,8 +104,8 @@ private async Task> HandleVerifiedPostAsync(stri } var scopes = authenticationResult.Principal!.GetScopes(); - var resources = await this._scopeManager.ListResourcesAsync(ImmutableArray.CreateRange(scopes), cancellationToken).ToListAsync(cancellationToken); - var principal = await OidcHelpers.CreatePrincipal(user, this._userManager, scopes, resources, authorizationId: null); + var resources = await this.ScopeManager.ListResourcesAsync(ImmutableArray.CreateRange(scopes), cancellationToken).ToListAsync(cancellationToken); + var principal = await OidcHelpers.CreatePrincipal(user, this.UserManager, scopes, resources, authorizationId: null); return Result.Success(new VerifyPostSignInResult( principal, @@ -117,7 +116,7 @@ private async Task> HandleVerifiedPostAsync(stri private async Task BuildDisplayDataAsync(AuthenticateResult authenticationResult, string userCodeFromQuery, CancellationToken cancellationToken) { var requestedScopes = authenticationResult.Principal!.GetScopes().ToArray(); - var scopeDisplay = await OidcHelpers.BuildScopeDisplay(requestedScopes, this._dbContext, cancellationToken); + var scopeDisplay = await OidcHelpers.BuildScopeDisplay(requestedScopes, this.DbContext, cancellationToken); var userCode = authenticationResult.Properties?.GetTokenValue(OpenIddictServerAspNetCoreConstants.Tokens.UserCode) ?? userCodeFromQuery; @@ -130,8 +129,8 @@ private async Task BuildDisplayDataAsync(AuthenticateResult a } else { - var application = await this._applicationManager.FindByClientIdAsync(clientId, cancellationToken); - clientName = application is null ? clientId : await this._applicationManager.GetDisplayNameAsync(application, cancellationToken) ?? clientId; + var application = await this.ApplicationManager.FindByClientIdAsync(clientId, cancellationToken); + clientName = application is null ? clientId : await this.ApplicationManager.GetDisplayNameAsync(application, cancellationToken) ?? clientId; } return new VerifyDisplayData(clientName, requestedScopes, scopeDisplay.IdentityScopes, scopeDisplay.ApiScopes, userCode); diff --git a/SecurityService.BusinessLogic/Requests/SecurityServiceCommands.cs b/SecurityService.BusinessLogic/Requests/SecurityServiceCommands.cs index 1ec4da65..02fb9ec9 100644 --- a/SecurityService.BusinessLogic/Requests/SecurityServiceCommands.cs +++ b/SecurityService.BusinessLogic/Requests/SecurityServiceCommands.cs @@ -6,51 +6,47 @@ namespace SecurityService.BusinessLogic.Requests; public static class SecurityServiceCommands { - public sealed record CreateClientCommand( - string ClientId, - string? Secret, - string ClientName, - string? ClientDescription, - IReadOnlyCollection AllowedScopes, - IReadOnlyCollection AllowedGrantTypes, - string? ClientUri, - IReadOnlyCollection ClientRedirectUris, - IReadOnlyCollection ClientPostLogoutRedirectUris, - bool RequireConsent, - bool AllowOfflineAccess) : IRequest; + public record CreateClientCommand(string ClientId, + string? Secret, + string ClientName, + string? ClientDescription, + IReadOnlyCollection AllowedScopes, + IReadOnlyCollection AllowedGrantTypes, + string? ClientUri, + IReadOnlyCollection ClientRedirectUris, + IReadOnlyCollection ClientPostLogoutRedirectUris, + bool RequireConsent, + bool AllowOfflineAccess) : IRequest; - public sealed record CreateApiScopeCommand(string Name, string? DisplayName, string? Description) + public record CreateApiScopeCommand(string Name, string? DisplayName, string? Description) : IRequest; - public sealed record CreateApiResourceCommand( - string Name, - string? DisplayName, - string? Description, - string? Secret, - IReadOnlyCollection Scopes, - IReadOnlyCollection UserClaims) : IRequest; + public record CreateApiResourceCommand(string Name, + string? DisplayName, + string? Description, + string? Secret, + IReadOnlyCollection Scopes, + IReadOnlyCollection UserClaims) : IRequest; - public sealed record CreateIdentityResourceCommand( - string Name, - string? DisplayName, - string? Description, - bool Required, - bool Emphasize, - bool ShowInDiscoveryDocument, - IReadOnlyCollection Claims) : IRequest; + public record CreateIdentityResourceCommand(string Name, + string? DisplayName, + string? Description, + bool Required, + bool Emphasize, + bool ShowInDiscoveryDocument, + IReadOnlyCollection Claims) : IRequest; - public sealed record CreateRoleCommand(string Name) : IRequest; + public record CreateRoleCommand(string Name) : IRequest; - public sealed record CreateUserCommand( - string? GivenName, - string? MiddleName, - string? FamilyName, - string UserName, - string Password, - string? EmailAddress, - string? PhoneNumber, - IReadOnlyDictionary Claims, - List Roles) : IRequest; + public record CreateUserCommand(string? GivenName, + string? MiddleName, + string? FamilyName, + string UserName, + string Password, + string? EmailAddress, + string? PhoneNumber, + IReadOnlyDictionary Claims, + List Roles) : IRequest; public record ChangeUserPasswordCommand(String UserName, String CurrentPassword, @@ -68,6 +64,6 @@ public record ProcessPasswordResetConfirmationCommand(String Username, String Password, String ClientId) : IRequest>; - public sealed record LoginCommand(string Username, string Password, bool RememberLogin) : IRequest; - public sealed record RevokeGrantCommand(string UserId, string AuthorizationId) : IRequest; + public record LoginCommand(string Username, string Password, bool RememberLogin) : IRequest; + public record RevokeGrantCommand(string UserId, string AuthorizationId) : IRequest; } diff --git a/SecurityService.BusinessLogic/Requests/SecurityServiceQueries.cs b/SecurityService.BusinessLogic/Requests/SecurityServiceQueries.cs index 7157df96..0f2d7c59 100644 --- a/SecurityService.BusinessLogic/Requests/SecurityServiceQueries.cs +++ b/SecurityService.BusinessLogic/Requests/SecurityServiceQueries.cs @@ -6,22 +6,22 @@ namespace SecurityService.BusinessLogic.Requests; public static class SecurityServiceQueries { - public sealed record GetClientQuery(string ClientId) : IRequest>; - public sealed record GetClientsQuery() : IRequest>>; + public record GetClientQuery(string ClientId) : IRequest>; + public record GetClientsQuery() : IRequest>>; - public sealed record GetApiScopeQuery(string Name) : IRequest>; - public sealed record GetApiScopesQuery() : IRequest>>; + public record GetApiScopeQuery(string Name) : IRequest>; + public record GetApiScopesQuery() : IRequest>>; - public sealed record GetApiResourceQuery(string Name) : IRequest>; - public sealed record GetApiResourcesQuery() : IRequest>>; + public record GetApiResourceQuery(string Name) : IRequest>; + public record GetApiResourcesQuery() : IRequest>>; - public sealed record GetIdentityResourceQuery(string Name) : IRequest>; - public sealed record GetIdentityResourcesQuery() : IRequest>>; + public record GetIdentityResourceQuery(string Name) : IRequest>; + public record GetIdentityResourcesQuery() : IRequest>>; - public sealed record GetRoleQuery(string RoleId) : IRequest>; - public sealed record GetRolesQuery() : IRequest>>; - public sealed record GetUserQuery(string UserId) : IRequest>; - public sealed record GetUsersQuery(string? UserName) : IRequest>>; - public sealed record GetExternalProvidersQuery() : IRequest>>; - public sealed record GetUserGrantsQuery(string UserId) : IRequest>>; + public record GetRoleQuery(string RoleId) : IRequest>; + public record GetRolesQuery() : IRequest>>; + public record GetUserQuery(string UserId) : IRequest>; + public record GetUsersQuery(string? UserName) : IRequest>>; + public record GetExternalProvidersQuery() : IRequest>>; + public record GetUserGrantsQuery(string UserId) : IRequest>>; } diff --git a/SecurityService.Database/Class1.cs b/SecurityService.Database/Class1.cs deleted file mode 100644 index fca0a45c..00000000 --- a/SecurityService.Database/Class1.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace SecurityService.Database; - -public class Class1 -{ - -} diff --git a/SecurityService.Database/ApplicationUser.cs b/SecurityService.Database/Entities/ApplicationUser.cs similarity index 86% rename from SecurityService.Database/ApplicationUser.cs rename to SecurityService.Database/Entities/ApplicationUser.cs index 85ed96cb..015e50ab 100644 --- a/SecurityService.Database/ApplicationUser.cs +++ b/SecurityService.Database/Entities/ApplicationUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace SecurityService.Database; +namespace SecurityService.Database.Entities; public sealed class ApplicationUser : IdentityUser { diff --git a/SecurityService.Models/ApiResourceDetails.cs b/SecurityService.Models/ApiResourceDetails.cs new file mode 100644 index 00000000..ff5776ac --- /dev/null +++ b/SecurityService.Models/ApiResourceDetails.cs @@ -0,0 +1,7 @@ +namespace SecurityService.Models; + +public record ApiResourceDetails(string Name, + string? DisplayName, + string? Description, + IReadOnlyCollection Scopes, + IReadOnlyCollection UserClaims); \ No newline at end of file diff --git a/SecurityService.Models/ApiScopeDetails.cs b/SecurityService.Models/ApiScopeDetails.cs new file mode 100644 index 00000000..4f7f2b5a --- /dev/null +++ b/SecurityService.Models/ApiScopeDetails.cs @@ -0,0 +1,5 @@ +namespace SecurityService.Models; + +public record ApiScopeDetails(string Name, + string? DisplayName, + string? Description); \ No newline at end of file diff --git a/SecurityService.Models/Class1.cs b/SecurityService.Models/ChangeUserPasswordResult.cs similarity index 98% rename from SecurityService.Models/Class1.cs rename to SecurityService.Models/ChangeUserPasswordResult.cs index d6f69dc4..08f2b6c6 100644 --- a/SecurityService.Models/Class1.cs +++ b/SecurityService.Models/ChangeUserPasswordResult.cs @@ -4,4 +4,4 @@ public class ChangeUserPasswordResult { public Boolean IsSuccessful { get; set; } public String RedirectUri { get; set; } -} +} \ No newline at end of file diff --git a/SecurityService.Models/ClientDetails.cs b/SecurityService.Models/ClientDetails.cs new file mode 100644 index 00000000..185d5cdb --- /dev/null +++ b/SecurityService.Models/ClientDetails.cs @@ -0,0 +1,13 @@ +namespace SecurityService.Models; + +public record ClientDetails(string ClientId, + string ClientName, + string? Description, + string? ClientUri, + IReadOnlyCollection AllowedScopes, + IReadOnlyCollection AllowedGrantTypes, + IReadOnlyCollection RedirectUris, + IReadOnlyCollection PostLogoutRedirectUris, + bool RequireConsent, + bool AllowOfflineAccess, + string ClientType); \ No newline at end of file diff --git a/SecurityService.Models/DetailsModels.cs b/SecurityService.Models/DetailsModels.cs deleted file mode 100644 index 45a8950d..00000000 --- a/SecurityService.Models/DetailsModels.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace SecurityService.Models; - -public sealed record ClientDetails( - string ClientId, - string ClientName, - string? Description, - string? ClientUri, - IReadOnlyCollection AllowedScopes, - IReadOnlyCollection AllowedGrantTypes, - IReadOnlyCollection RedirectUris, - IReadOnlyCollection PostLogoutRedirectUris, - bool RequireConsent, - bool AllowOfflineAccess, - string ClientType); - -public sealed record ApiScopeDetails( - string Name, - string? DisplayName, - string? Description); - -public sealed record ApiResourceDetails( - string Name, - string? DisplayName, - string? Description, - IReadOnlyCollection Scopes, - IReadOnlyCollection UserClaims); - -public sealed record IdentityResourceDetails( - string Name, - string? DisplayName, - string? Description, - bool Required, - bool Emphasize, - bool ShowInDiscoveryDocument, - IReadOnlyCollection Claims); - -public sealed record RoleDetails( - String RoleId, - string Name); - -public sealed record UserDetails( - String UserId, - string UserName, - string? EmailAddress, - string? PhoneNumber, - string? GivenName, - string? MiddleName, - string? FamilyName, - DateTime RegistrationDateTime, - IReadOnlyDictionary Claims, - IReadOnlyCollection Roles); - -public sealed record ExternalProviderDetails(string Name, string DisplayName); diff --git a/SecurityService.Models/ExternalProviderDetails.cs b/SecurityService.Models/ExternalProviderDetails.cs new file mode 100644 index 00000000..a5a97ba1 --- /dev/null +++ b/SecurityService.Models/ExternalProviderDetails.cs @@ -0,0 +1,3 @@ +namespace SecurityService.Models; + +public record ExternalProviderDetails(string Name, string DisplayName); diff --git a/SecurityService.Models/GrantDetails.cs b/SecurityService.Models/GrantDetails.cs index dc736730..1d31dcf3 100644 --- a/SecurityService.Models/GrantDetails.cs +++ b/SecurityService.Models/GrantDetails.cs @@ -1,8 +1,7 @@ namespace SecurityService.Models; -public sealed record GrantDetails( - string AuthorizationId, - string ClientId, - string DisplayName, - IReadOnlyCollection Scopes, - DateTimeOffset? CreatedAt); +public record GrantDetails(string AuthorizationId, + string ClientId, + string DisplayName, + IReadOnlyCollection Scopes, + DateTimeOffset? CreatedAt); diff --git a/SecurityService.Models/IdentityResourceDetails.cs b/SecurityService.Models/IdentityResourceDetails.cs new file mode 100644 index 00000000..3951274a --- /dev/null +++ b/SecurityService.Models/IdentityResourceDetails.cs @@ -0,0 +1,9 @@ +namespace SecurityService.Models; + +public record IdentityResourceDetails(string Name, + string? DisplayName, + string? Description, + bool Required, + bool Emphasize, + bool ShowInDiscoveryDocument, + IReadOnlyCollection Claims); \ No newline at end of file diff --git a/SecurityService.Models/OperationResult.cs b/SecurityService.Models/OperationResult.cs deleted file mode 100644 index 89ba4884..00000000 --- a/SecurityService.Models/OperationResult.cs +++ /dev/null @@ -1,56 +0,0 @@ -namespace SecurityService.Models; - -public enum OperationResultStatus -{ - Success, - Invalid, - NotFound, - Conflict, - Error -} - -public class OperationResult -{ - protected OperationResult(OperationResultStatus status, string? errorMessage = null) - { - this.Status = status; - this.ErrorMessage = errorMessage; - } - - public OperationResultStatus Status { get; } - - public string? ErrorMessage { get; } - - public bool IsSuccess => this.Status == OperationResultStatus.Success; - - public static OperationResult Success() => new(OperationResultStatus.Success); - - public static OperationResult Invalid(string message) => new(OperationResultStatus.Invalid, message); - - public static OperationResult NotFound(string message) => new(OperationResultStatus.NotFound, message); - - public static OperationResult Conflict(string message) => new(OperationResultStatus.Conflict, message); - - public static OperationResult Error(string message) => new(OperationResultStatus.Error, message); -} - -public sealed class OperationResult : OperationResult -{ - private OperationResult(OperationResultStatus status, T? data, string? errorMessage) - : base(status, errorMessage) - { - this.Data = data; - } - - public T? Data { get; } - - public static OperationResult Success(T data) => new(OperationResultStatus.Success, data, null); - - public static new OperationResult Invalid(string message) => new(OperationResultStatus.Invalid, default, message); - - public static new OperationResult NotFound(string message) => new(OperationResultStatus.NotFound, default, message); - - public static new OperationResult Conflict(string message) => new(OperationResultStatus.Conflict, default, message); - - public static new OperationResult Error(string message) => new(OperationResultStatus.Error, default, message); -} diff --git a/SecurityService.Models/RoleDetails.cs b/SecurityService.Models/RoleDetails.cs new file mode 100644 index 00000000..b8196259 --- /dev/null +++ b/SecurityService.Models/RoleDetails.cs @@ -0,0 +1,4 @@ +namespace SecurityService.Models; + +public record RoleDetails(String RoleId, + string Name); \ No newline at end of file diff --git a/SecurityService.Models/UserDetails.cs b/SecurityService.Models/UserDetails.cs new file mode 100644 index 00000000..090b133c --- /dev/null +++ b/SecurityService.Models/UserDetails.cs @@ -0,0 +1,12 @@ +namespace SecurityService.Models; + +public record UserDetails(String UserId, + string UserName, + string? EmailAddress, + string? PhoneNumber, + string? GivenName, + string? MiddleName, + string? FamilyName, + DateTime RegistrationDateTime, + IReadOnlyDictionary Claims, + IReadOnlyCollection Roles); \ No newline at end of file diff --git a/SecurityService.UnitTests/Infrastructure/IdentityMocks.cs b/SecurityService.UnitTests/Infrastructure/IdentityMocks.cs index 855458bc..812080a0 100644 --- a/SecurityService.UnitTests/Infrastructure/IdentityMocks.cs +++ b/SecurityService.UnitTests/Infrastructure/IdentityMocks.cs @@ -8,7 +8,7 @@ using Microsoft.Extensions.Options; using Microsoft.Extensions.DependencyInjection; using Moq; -using SecurityService.Database; +using SecurityService.Database.Entities; namespace SecurityService.UnitTests.Infrastructure; diff --git a/SecurityService.UnitTests/Infrastructure/TestServiceProviderFactory.cs b/SecurityService.UnitTests/Infrastructure/TestServiceProviderFactory.cs index c9b6d11d..4403df27 100644 --- a/SecurityService.UnitTests/Infrastructure/TestServiceProviderFactory.cs +++ b/SecurityService.UnitTests/Infrastructure/TestServiceProviderFactory.cs @@ -5,8 +5,8 @@ using Microsoft.IdentityModel.Tokens; using SecurityService.BusinessLogic; using SecurityService.BusinessLogic.Requests; -using SecurityService.Database; using SecurityService.Database.DbContexts; +using SecurityService.Database.Entities; namespace SecurityService.UnitTests.Infrastructure; diff --git a/SecurityService.UnitTests/Pages/ConfirmEmailPageModelTests.cs b/SecurityService.UnitTests/Pages/ConfirmEmailPageModelTests.cs index 0e87ca22..0fca008c 100644 --- a/SecurityService.UnitTests/Pages/ConfirmEmailPageModelTests.cs +++ b/SecurityService.UnitTests/Pages/ConfirmEmailPageModelTests.cs @@ -6,9 +6,9 @@ using Microsoft.Extensions.DependencyInjection; using Moq; using SecurityService.BusinessLogic; -using SecurityService.Database; using SecurityService.UnitTests.Infrastructure; using Shouldly; +using SecurityService.Database.Entities; namespace SecurityService.UnitTests.Pages; diff --git a/SecurityService.UnitTests/Pages/ForgotPasswordPageModelTests.cs b/SecurityService.UnitTests/Pages/ForgotPasswordPageModelTests.cs index d3cfe7d2..3814e633 100644 --- a/SecurityService.UnitTests/Pages/ForgotPasswordPageModelTests.cs +++ b/SecurityService.UnitTests/Pages/ForgotPasswordPageModelTests.cs @@ -7,9 +7,9 @@ using Microsoft.Extensions.DependencyInjection; using Moq; using SecurityService.BusinessLogic; -using SecurityService.Database; using SecurityService.UnitTests.Infrastructure; using Shouldly; +using SecurityService.Database.Entities; namespace SecurityService.UnitTests.Pages; diff --git a/SecurityService.UnitTests/Pages/GrantsPageModelTests.cs b/SecurityService.UnitTests/Pages/GrantsPageModelTests.cs index 0101b0a3..cc04d3fa 100644 --- a/SecurityService.UnitTests/Pages/GrantsPageModelTests.cs +++ b/SecurityService.UnitTests/Pages/GrantsPageModelTests.cs @@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using Moq; using SecurityService.BusinessLogic.Requests; -using SecurityService.Database; +using SecurityService.Database.Entities; using SecurityService.Models; using SecurityService.UnitTests.Infrastructure; using Shouldly; diff --git a/SecurityService.UnitTests/Pages/ResetPasswordPageModelTests.cs b/SecurityService.UnitTests/Pages/ResetPasswordPageModelTests.cs index 130c5734..d0ac30bc 100644 --- a/SecurityService.UnitTests/Pages/ResetPasswordPageModelTests.cs +++ b/SecurityService.UnitTests/Pages/ResetPasswordPageModelTests.cs @@ -5,7 +5,6 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; using Moq; -using SecurityService.Database; using SecurityService.Database.DbContexts; using SecurityService.Database.Entities; using SecurityService.UnitTests.Infrastructure; diff --git a/SecurityService.UnitTests/RequestHandlers/UserRequestHandlerTests.cs b/SecurityService.UnitTests/RequestHandlers/UserRequestHandlerTests.cs index 28211504..4b989c89 100644 --- a/SecurityService.UnitTests/RequestHandlers/UserRequestHandlerTests.cs +++ b/SecurityService.UnitTests/RequestHandlers/UserRequestHandlerTests.cs @@ -5,7 +5,6 @@ using Moq; using SecurityService.BusinessLogic; using SecurityService.BusinessLogic.Requests; -using SecurityService.Database; using SecurityService.Database.DbContexts; using SecurityService.Database.Entities; using SecurityService.UnitTests.Infrastructure; diff --git a/SecurityService.UnitTests/RequestHandlers/VerifyRequestHandlerTests.cs b/SecurityService.UnitTests/RequestHandlers/VerifyRequestHandlerTests.cs index 82fe74d8..60d54b15 100644 --- a/SecurityService.UnitTests/RequestHandlers/VerifyRequestHandlerTests.cs +++ b/SecurityService.UnitTests/RequestHandlers/VerifyRequestHandlerTests.cs @@ -7,8 +7,8 @@ using OpenIddict.Server.AspNetCore; using SecurityService.BusinessLogic.Oidc; using SecurityService.BusinessLogic.RequestHandlers; -using SecurityService.Database; using SecurityService.Database.DbContexts; +using SecurityService.Database.Entities; using SecurityService.UnitTests.Infrastructure; using Shouldly; diff --git a/SecurityService/Oidc/OidcEndpoints.cs b/SecurityService/Endpoints/OidcEndpoints.cs similarity index 94% rename from SecurityService/Oidc/OidcEndpoints.cs rename to SecurityService/Endpoints/OidcEndpoints.cs index fdc89aba..5c8f780d 100644 --- a/SecurityService/Oidc/OidcEndpoints.cs +++ b/SecurityService/Endpoints/OidcEndpoints.cs @@ -1,4 +1,4 @@ -namespace SecurityService.Oidc; +namespace SecurityService.Endpoints; public static class OidcEndpoints { diff --git a/SecurityService/Handlers/ApiResourceHandler.cs b/SecurityService/Handlers/ApiResourceHandler.cs index 3fe52741..a1461946 100644 --- a/SecurityService/Handlers/ApiResourceHandler.cs +++ b/SecurityService/Handlers/ApiResourceHandler.cs @@ -10,15 +10,10 @@ namespace SecurityService.Handlers; public static class ApiResourceHandler { - public static async Task CreateApiResource(IMediator mediator, CreateApiResourceRequest request, CancellationToken cancellationToken) - { - Result result = await mediator.Send(new SecurityServiceCommands.CreateApiResourceCommand( - request.Name, - request.DisplayName, - request.Description, - request.Secret, - request.Scopes, - request.UserClaims), cancellationToken); + public static async Task CreateApiResource(IMediator mediator, CreateApiResourceRequest request, CancellationToken cancellationToken) { + SecurityServiceCommands.CreateApiResourceCommand command = new(request.Name, request.DisplayName, request.Description, request.Secret, request.Scopes, request.UserClaims); + + Result result = await mediator.Send(command, cancellationToken); return ResponseFactory.FromResult(result); } @@ -27,7 +22,7 @@ public static async Task GetApiResource(IMediator mediator, string name, CancellationToken cancellationToken) { - SecurityServiceQueries.GetApiResourceQuery query = new SecurityServiceQueries.GetApiResourceQuery(name); + SecurityServiceQueries.GetApiResourceQuery query = new(name); Result result = await mediator.Send(query, cancellationToken); @@ -38,7 +33,7 @@ public static async Task GetApiResources(IMediator mediator, CancellationToken cancellationToken) { - SecurityServiceQueries.GetApiResourcesQuery query = new SecurityServiceQueries.GetApiResourcesQuery(); + SecurityServiceQueries.GetApiResourcesQuery query = new(); Result> result = await mediator.Send(query, cancellationToken); diff --git a/SecurityService/Handlers/ApiScopeHandler.cs b/SecurityService/Handlers/ApiScopeHandler.cs index 3da883da..2c15355e 100644 --- a/SecurityService/Handlers/ApiScopeHandler.cs +++ b/SecurityService/Handlers/ApiScopeHandler.cs @@ -2,30 +2,37 @@ using SecurityService.BusinessLogic.Requests; using SecurityService.DataTransferObjects; using SecurityService.Factories; +using SecurityService.Models; using Shared.Results.Web; +using SimpleResults; namespace SecurityService.Handlers; public static class ApiScopeHandler { - public static async Task CreateApiScope(IMediator mediator, CreateApiScopeRequest request, CancellationToken cancellationToken) - { - var result = await mediator.Send(new SecurityServiceCommands.CreateApiScopeCommand(request.Name, request.DisplayName, request.Description), cancellationToken); + public static async Task CreateApiScope(IMediator mediator, CreateApiScopeRequest request, CancellationToken cancellationToken) { + SecurityServiceCommands.CreateApiScopeCommand command = new(request.Name, request.DisplayName, request.Description); + + Result result = await mediator.Send(command, cancellationToken); + return ResponseFactory.FromResult(result); } public static async Task GetApiScope(IMediator mediator, string name, CancellationToken cancellationToken) { - var query = new SecurityServiceQueries.GetApiScopeQuery(name); - var result = await mediator.Send(query, cancellationToken); + SecurityServiceQueries.GetApiScopeQuery query = new(name); + + Result result = await mediator.Send(query, cancellationToken); + return ResponseFactory.FromResult(result, ModelFactory.ConvertFrom); } public static async Task GetApiScopes(IMediator mediator, CancellationToken cancellationToken) { - var query = new SecurityServiceQueries.GetApiScopesQuery(); - var result = await mediator.Send(query, cancellationToken); + SecurityServiceQueries.GetApiScopesQuery query = new(); + Result> result = await mediator.Send(query, cancellationToken); + return ResponseFactory.FromResult(result, ModelFactory.ConvertFrom); } } diff --git a/SecurityService/Handlers/AuthorizeHandler.cs b/SecurityService/Handlers/AuthorizeHandler.cs new file mode 100644 index 00000000..86f02a32 --- /dev/null +++ b/SecurityService/Handlers/AuthorizeHandler.cs @@ -0,0 +1,19 @@ +using MediatR; +using SecurityService.BusinessLogic.Oidc; +using SecurityService.Factories; +using SimpleResults; + +namespace SecurityService.Handlers; + +public static class AuthorizeHandler +{ + public static async Task AuthorizeAsync(HttpContext context, + IMediator mediator, + CancellationToken cancellationToken) { + OidcCommands.AuthorizeCommand command = new OidcCommands.AuthorizeCommand(context); + + Result result = await mediator.Send(command, cancellationToken); + + return OidcResponseFactory.FromResult(result); + } +} diff --git a/SecurityService/Handlers/ClientHandler.cs b/SecurityService/Handlers/ClientHandler.cs index 1d63714a..721a946e 100644 --- a/SecurityService/Handlers/ClientHandler.cs +++ b/SecurityService/Handlers/ClientHandler.cs @@ -2,7 +2,9 @@ using SecurityService.BusinessLogic.Requests; using SecurityService.DataTransferObjects; using SecurityService.Factories; +using SecurityService.Models; using Shared.Results.Web; +using SimpleResults; namespace SecurityService.Handlers; @@ -10,8 +12,7 @@ public static class ClientHandler { public static async Task CreateClient(IMediator mediator, CreateClientRequest request, CancellationToken cancellationToken) { - var result = await mediator.Send(new SecurityServiceCommands.CreateClientCommand( - request.ClientId, + SecurityServiceCommands.CreateClientCommand command = new(request.ClientId, request.Secret, request.ClientName, request.ClientDescription, @@ -21,13 +22,29 @@ public static async Task CreateClient(IMediator mediator, CreateClientR request.ClientRedirectUris, request.ClientPostLogoutRedirectUris, request.RequireConsent, - request.AllowOfflineAccess), cancellationToken); + request.AllowOfflineAccess); + + Result result = await mediator.Send(command, cancellationToken); return ResponseFactory.FromResult(result); } - public static async Task GetClient(IMediator mediator, string clientId, CancellationToken cancellationToken) - => ResponseFactory.FromResult(await mediator.Send(new SecurityServiceQueries.GetClientQuery(clientId), cancellationToken), ModelFactory.ConvertFrom); - public static async Task GetClients(IMediator mediator, CancellationToken cancellationToken) - => ResponseFactory.FromResult(await mediator.Send(new SecurityServiceQueries.GetClientsQuery(), cancellationToken), ModelFactory.ConvertFrom); + public static async Task GetClient(IMediator mediator, + string clientId, + CancellationToken cancellationToken) { + SecurityServiceQueries.GetClientQuery query = new(clientId); + + Result result = await mediator.Send(query, cancellationToken); + + return ResponseFactory.FromResult(result, ModelFactory.ConvertFrom); + } + + public static async Task GetClients(IMediator mediator, + CancellationToken cancellationToken) { + SecurityServiceQueries.GetClientsQuery query = new(); + + Result> result = await mediator.Send(query, cancellationToken); + + return ResponseFactory.FromResult(result, ModelFactory.ConvertFrom); + } } diff --git a/SecurityService/Handlers/IdentityResourceHandler.cs b/SecurityService/Handlers/IdentityResourceHandler.cs index fda04f89..a476f64f 100644 --- a/SecurityService/Handlers/IdentityResourceHandler.cs +++ b/SecurityService/Handlers/IdentityResourceHandler.cs @@ -2,29 +2,35 @@ using SecurityService.BusinessLogic.Requests; using SecurityService.DataTransferObjects; using SecurityService.Factories; +using SecurityService.Models; using Shared.Results.Web; +using SimpleResults; namespace SecurityService.Handlers; public static class IdentityResourceHandler { - public static async Task CreateIdentityResource(IMediator mediator, CreateIdentityResourceRequest request, CancellationToken cancellationToken) - { - var result = await mediator.Send(new SecurityServiceCommands.CreateIdentityResourceCommand( - request.Name, - request.DisplayName, - request.Description, - request.Required, - request.Emphasize, - request.ShowInDiscoveryDocument, - request.Claims), cancellationToken); + public static async Task CreateIdentityResource(IMediator mediator, CreateIdentityResourceRequest request, CancellationToken cancellationToken) { + SecurityServiceCommands.CreateIdentityResourceCommand command = new(request.Name, request.DisplayName, request.Description, request.Required, request.Emphasize, request.ShowInDiscoveryDocument, request.Claims); + + Result result = await mediator.Send(command, cancellationToken); return ResponseFactory.FromResult(result); } - public static async Task GetIdentityResource(IMediator mediator, string name, CancellationToken cancellationToken) - => ResponseFactory.FromResult(await mediator.Send(new SecurityServiceQueries.GetIdentityResourceQuery(name), cancellationToken), ModelFactory.ConvertFrom); + public static async Task GetIdentityResource(IMediator mediator, string name, CancellationToken cancellationToken) { + SecurityServiceQueries.GetIdentityResourceQuery query = new(name); + + Result result = await mediator.Send(query, cancellationToken); + + return ResponseFactory.FromResult(result, ModelFactory.ConvertFrom); + } - public static async Task GetIdentityResources(IMediator mediator, CancellationToken cancellationToken) - => ResponseFactory.FromResult(await mediator.Send(new SecurityServiceQueries.GetIdentityResourcesQuery(), cancellationToken), ModelFactory.ConvertFrom); -} + public static async Task GetIdentityResources(IMediator mediator, CancellationToken cancellationToken) { + SecurityServiceQueries.GetIdentityResourcesQuery query = new(); + + Result> result = await mediator.Send(query, cancellationToken); + + return ResponseFactory.FromResult(result, ModelFactory.ConvertFrom); + } +} \ No newline at end of file diff --git a/SecurityService/Handlers/LogoutHandler.cs b/SecurityService/Handlers/LogoutHandler.cs new file mode 100644 index 00000000..88ed8cff --- /dev/null +++ b/SecurityService/Handlers/LogoutHandler.cs @@ -0,0 +1,19 @@ +using MediatR; +using SecurityService.BusinessLogic.Oidc; +using SecurityService.Factories; +using SimpleResults; + +namespace SecurityService.Handlers; + +public static class LogoutHandler +{ + public static async Task LogoutAsync(HttpContext context, + IMediator mediator, + CancellationToken cancellationToken) { + OidcCommands.LogoutCommand command = new(context); + + Result result = await mediator.Send(command, cancellationToken); + + return OidcResponseFactory.FromResult(result); + } +} diff --git a/SecurityService/Handlers/RoleHandler.cs b/SecurityService/Handlers/RoleHandler.cs index 4024cdcd..a0904284 100644 --- a/SecurityService/Handlers/RoleHandler.cs +++ b/SecurityService/Handlers/RoleHandler.cs @@ -2,21 +2,37 @@ using SecurityService.BusinessLogic.Requests; using SecurityService.DataTransferObjects; using SecurityService.Factories; +using SecurityService.Models; using Shared.Results.Web; +using SimpleResults; namespace SecurityService.Handlers; public static class RoleHandler { - public static async Task CreateRole(IMediator mediator, CreateRoleRequest request, CancellationToken cancellationToken) - { - var result = await mediator.Send(new SecurityServiceCommands.CreateRoleCommand(request.Name), cancellationToken); + public static async Task CreateRole(IMediator mediator, CreateRoleRequest request, CancellationToken cancellationToken) { + SecurityServiceCommands.CreateRoleCommand command = new(request.Name); + + Result result = await mediator.Send(command, cancellationToken); + return ResponseFactory.FromResult(result); } - public static async Task GetRole(IMediator mediator, string roleId, CancellationToken cancellationToken) - => ResponseFactory.FromResult(await mediator.Send(new SecurityServiceQueries.GetRoleQuery(roleId), cancellationToken), ModelFactory.ConvertFrom); + public static async Task GetRole(IMediator mediator, + string roleId, + CancellationToken cancellationToken) { + SecurityServiceQueries.GetRoleQuery query = new(roleId); + Result result = await mediator.Send(query, cancellationToken); + + return ResponseFactory.FromResult(result, ModelFactory.ConvertFrom); + } public static async Task GetRoles(IMediator mediator, CancellationToken cancellationToken) - => ResponseFactory.FromResult(await mediator.Send(new SecurityServiceQueries.GetRolesQuery(), cancellationToken), ModelFactory.ConvertFrom); + { + SecurityServiceQueries.GetRolesQuery query = new(); + + Result> result = await mediator.Send(query, cancellationToken); + + return ResponseFactory.FromResult(result, ModelFactory.ConvertFrom); + } } diff --git a/SecurityService/Handlers/TokenHandler.cs b/SecurityService/Handlers/TokenHandler.cs new file mode 100644 index 00000000..0e627875 --- /dev/null +++ b/SecurityService/Handlers/TokenHandler.cs @@ -0,0 +1,19 @@ +using MediatR; +using SecurityService.BusinessLogic.Oidc; +using SecurityService.Factories; +using SimpleResults; + +namespace SecurityService.Handlers; + +public static class TokenHandler +{ + public static async Task TokenAsync(HttpContext context, + IMediator mediator, + CancellationToken cancellationToken) { + OidcCommands.TokenCommand command = new(context); + + Result result = await mediator.Send(command, cancellationToken); + + return OidcResponseFactory.FromResult(result); + } +} diff --git a/SecurityService/Handlers/UserHandler.cs b/SecurityService/Handlers/UserHandler.cs index 197943a7..2bda5fab 100644 --- a/SecurityService/Handlers/UserHandler.cs +++ b/SecurityService/Handlers/UserHandler.cs @@ -2,31 +2,37 @@ using SecurityService.BusinessLogic.Requests; using SecurityService.DataTransferObjects; using SecurityService.Factories; +using SecurityService.Models; using Shared.Results.Web; +using SimpleResults; namespace SecurityService.Handlers; public static class UserHandler { - public static async Task CreateUser(IMediator mediator, CreateUserRequest request, CancellationToken cancellationToken) - { - var result = await mediator.Send(new SecurityServiceCommands.CreateUserCommand( - request.GivenName, - request.MiddleName, - request.FamilyName, - request.UserName, - request.Password, - request.EmailAddress, - request.PhoneNumber, - request.Claims, - request.Roles), cancellationToken); + public static async Task CreateUser(IMediator mediator, CreateUserRequest request, CancellationToken cancellationToken) { + SecurityServiceCommands.CreateUserCommand command = new(request.GivenName, request.MiddleName, request.FamilyName, request.UserName, request.Password, request.EmailAddress, request.PhoneNumber, request.Claims, request.Roles); + + Result result = await mediator.Send(command, cancellationToken); return ResponseFactory.FromResult(result); } - public static async Task GetUser(IMediator mediator, string userId, CancellationToken cancellationToken) - => ResponseFactory.FromResult(await mediator.Send(new SecurityServiceQueries.GetUserQuery(userId), cancellationToken), ModelFactory.ConvertFrom); + public static async Task GetUser(IMediator mediator, + string userId, + CancellationToken cancellationToken) { + SecurityServiceQueries.GetUserQuery query = new(userId); - public static async Task GetUsers(IMediator mediator, string? userName, CancellationToken cancellationToken) - => ResponseFactory.FromResult(await mediator.Send(new SecurityServiceQueries.GetUsersQuery(userName), cancellationToken), ModelFactory.ConvertFrom); -} + Result result = await mediator.Send(query, cancellationToken); + + return ResponseFactory.FromResult(result, ModelFactory.ConvertFrom); + } + + public static async Task GetUsers(IMediator mediator, string? userName, CancellationToken cancellationToken) { + SecurityServiceQueries.GetUsersQuery query = new(userName); + + Result> result = await mediator.Send(query, cancellationToken); + + return ResponseFactory.FromResult(result, ModelFactory.ConvertFrom); + } +} \ No newline at end of file diff --git a/SecurityService/Handlers/UserInfoHandler.cs b/SecurityService/Handlers/UserInfoHandler.cs new file mode 100644 index 00000000..b520a04f --- /dev/null +++ b/SecurityService/Handlers/UserInfoHandler.cs @@ -0,0 +1,19 @@ +using MediatR; +using SecurityService.BusinessLogic.Oidc; +using SecurityService.Factories; +using SimpleResults; + +namespace SecurityService.Handlers; + +public static class UserInfoHandler +{ + public static async Task UserInfoAsync(HttpContext context, + IMediator mediator, + CancellationToken cancellationToken) { + OidcCommands.UserInfoCommand command = new OidcCommands.UserInfoCommand(context); + + Result result = await mediator.Send(command, cancellationToken); + + return OidcResponseFactory.FromResult(result); + } +} diff --git a/SecurityService/Oidc/Handlers/AuthorizeHandler.cs b/SecurityService/Oidc/Handlers/AuthorizeHandler.cs deleted file mode 100644 index 0334b608..00000000 --- a/SecurityService/Oidc/Handlers/AuthorizeHandler.cs +++ /dev/null @@ -1,11 +0,0 @@ -using MediatR; -using SecurityService.BusinessLogic.Oidc; -using SecurityService.Factories; - -namespace SecurityService.Oidc.Handlers; - -public static class AuthorizeHandler -{ - public static async Task AuthorizeAsync(HttpContext context, IMediator mediator, CancellationToken cancellationToken) - => OidcResponseFactory.FromResult(await mediator.Send(new OidcCommands.AuthorizeCommand(context), cancellationToken)); -} diff --git a/SecurityService/Oidc/Handlers/LogoutHandler.cs b/SecurityService/Oidc/Handlers/LogoutHandler.cs deleted file mode 100644 index efc34f87..00000000 --- a/SecurityService/Oidc/Handlers/LogoutHandler.cs +++ /dev/null @@ -1,11 +0,0 @@ -using MediatR; -using SecurityService.BusinessLogic.Oidc; -using SecurityService.Factories; - -namespace SecurityService.Oidc.Handlers; - -public static class LogoutHandler -{ - public static async Task LogoutAsync(HttpContext context, IMediator mediator, CancellationToken cancellationToken) - => OidcResponseFactory.FromResult(await mediator.Send(new OidcCommands.LogoutCommand(context), cancellationToken)); -} diff --git a/SecurityService/Oidc/Handlers/TokenHandler.cs b/SecurityService/Oidc/Handlers/TokenHandler.cs deleted file mode 100644 index bdba6eb6..00000000 --- a/SecurityService/Oidc/Handlers/TokenHandler.cs +++ /dev/null @@ -1,11 +0,0 @@ -using MediatR; -using SecurityService.BusinessLogic.Oidc; -using SecurityService.Factories; - -namespace SecurityService.Oidc.Handlers; - -public static class TokenHandler -{ - public static async Task TokenAsync(HttpContext context, IMediator mediator, CancellationToken cancellationToken) - => OidcResponseFactory.FromResult(await mediator.Send(new OidcCommands.TokenCommand(context), cancellationToken)); -} diff --git a/SecurityService/Oidc/Handlers/UserInfoHandler.cs b/SecurityService/Oidc/Handlers/UserInfoHandler.cs deleted file mode 100644 index 672742e4..00000000 --- a/SecurityService/Oidc/Handlers/UserInfoHandler.cs +++ /dev/null @@ -1,11 +0,0 @@ -using MediatR; -using SecurityService.BusinessLogic.Oidc; -using SecurityService.Factories; - -namespace SecurityService.Oidc.Handlers; - -public static class UserInfoHandler -{ - public static async Task UserInfoAsync(HttpContext context, IMediator mediator, CancellationToken cancellationToken) - => OidcResponseFactory.FromResult(await mediator.Send(new OidcCommands.UserInfoCommand(context), cancellationToken)); -} diff --git a/SecurityService/Pages/Account/Grants/Index.cshtml.cs b/SecurityService/Pages/Account/Grants/Index.cshtml.cs index 6720e83a..cf9c5bfc 100644 --- a/SecurityService/Pages/Account/Grants/Index.cshtml.cs +++ b/SecurityService/Pages/Account/Grants/Index.cshtml.cs @@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using SecurityService.BusinessLogic.Oidc; using SecurityService.BusinessLogic.Requests; -using SecurityService.Database; +using SecurityService.Database.Entities; using SecurityService.Models; namespace SecurityService.Pages.Account.Grants; diff --git a/SecurityService/Pages/_ViewImports.cshtml b/SecurityService/Pages/_ViewImports.cshtml index bffe8bd8..b487e89c 100644 --- a/SecurityService/Pages/_ViewImports.cshtml +++ b/SecurityService/Pages/_ViewImports.cshtml @@ -1,3 +1 @@ -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers -@using SecurityService.Oidc - +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers \ No newline at end of file diff --git a/SecurityService/Program.cs b/SecurityService/Program.cs index b001f21b..a42f6066 100644 --- a/SecurityService/Program.cs +++ b/SecurityService/Program.cs @@ -16,12 +16,10 @@ using SecurityService.BusinessLogic.Requests; using SecurityService.Common; using SecurityService.Configuration; -using SecurityService.Database; using SecurityService.Database.DbContexts; using SecurityService.Endpoints; using SecurityService.HealthChecks; using SecurityService.HostedServices; -using SecurityService.Oidc; using Sentry.Extensibility; using Shared.Extensions; using Shared.General; @@ -36,6 +34,7 @@ using Logger = Shared.Logger.Logger; using NLog.Extensions.Logging; using LogLevel = Microsoft.Extensions.Logging.LogLevel; +using SecurityService.Database.Entities; var builder = WebApplication.CreateBuilder(new WebApplicationOptions { diff --git a/SecurityServiceTestUI/Controllers/HomeController.cs b/SecurityServiceTestUI/Controllers/HomeController.cs index 1f291d1c..fc90c1d1 100644 --- a/SecurityServiceTestUI/Controllers/HomeController.cs +++ b/SecurityServiceTestUI/Controllers/HomeController.cs @@ -14,13 +14,6 @@ namespace SecurityServiceTestUI.Controllers public class HomeController : Controller { - private readonly ILogger _logger; - - public HomeController(ILogger logger) - { - _logger = logger; - } - public IActionResult Index() { return View();