From 609e9c731dbb989b8913285789c5be01e50b5307 Mon Sep 17 00:00:00 2001 From: Jasper Hedegaard Bojsen Date: Tue, 26 Dec 2023 09:32:57 +0100 Subject: [PATCH 1/2] Code clean up --- .../Saas.Admin.Service/Exceptions/ItemNotFoundExcepton.cs | 4 ---- .../Controllers/PermissionsController.cs | 4 ++-- .../Exceptions/ItemAlreadyExistsException.cs | 4 ---- .../Exceptions/ItemNotFoundException.cs | 4 ---- .../Exceptions/UserNotFoundException.cs | 4 ---- .../Saas.Identity/Crypto/ClientAssertionSigningProvider.cs | 2 +- 6 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/Saas.Admin/Saas.Admin.Service/Exceptions/ItemNotFoundExcepton.cs b/src/Saas.Admin/Saas.Admin.Service/Exceptions/ItemNotFoundExcepton.cs index 9ec294b5..1da8770e 100644 --- a/src/Saas.Admin/Saas.Admin.Service/Exceptions/ItemNotFoundExcepton.cs +++ b/src/Saas.Admin/Saas.Admin.Service/Exceptions/ItemNotFoundExcepton.cs @@ -13,8 +13,4 @@ public ItemNotFoundExcepton(string? message) : base(message) public ItemNotFoundExcepton(string? message, Exception? innerException) : base(message, innerException) { } - - protected ItemNotFoundExcepton(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/PermissionsController.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/PermissionsController.cs index 5660a50f..bfe7fbad 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/PermissionsController.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/PermissionsController.cs @@ -38,7 +38,7 @@ public async Task>> GetTenantUsers(Guid tenantId) } catch (Exception ex) { - _logger.LogError("Unable to get Tenant Users.", ex); + _logger.LogError("Unable to get Tenant Users: {ex}", ex); throw; } @@ -67,7 +67,7 @@ public async Task>> GetTenantUsers(Guid tenantId) } catch (Exception ex) { - _logger.LogError("Unhandled exception", ex); + _logger.LogError("Unhandled exception: {ex}", ex); throw; } } diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Exceptions/ItemAlreadyExistsException.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Exceptions/ItemAlreadyExistsException.cs index 80ca04fd..db133c51 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Exceptions/ItemAlreadyExistsException.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Exceptions/ItemAlreadyExistsException.cs @@ -13,8 +13,4 @@ public ItemAlreadyExistsException(string? message) : base(message) public ItemAlreadyExistsException(string? message, Exception? innerException) : base(message, innerException) { } - - protected ItemAlreadyExistsException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Exceptions/ItemNotFoundException.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Exceptions/ItemNotFoundException.cs index 0260186c..25970dcd 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Exceptions/ItemNotFoundException.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Exceptions/ItemNotFoundException.cs @@ -13,8 +13,4 @@ public ItemNotFoundException(string? message) : base(message) public ItemNotFoundException(string? message, Exception? innerException) : base(message, innerException) { } - - protected ItemNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Exceptions/UserNotFoundException.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Exceptions/UserNotFoundException.cs index 12804392..f30c134b 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Exceptions/UserNotFoundException.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Exceptions/UserNotFoundException.cs @@ -13,8 +13,4 @@ public UserNotFoundException(string? message) : base(message) public UserNotFoundException(string? message, Exception? innerException) : base(message, innerException) { } - - protected UserNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } } diff --git a/src/Saas.Lib/Saas.Identity/Crypto/ClientAssertionSigningProvider.cs b/src/Saas.Lib/Saas.Identity/Crypto/ClientAssertionSigningProvider.cs index 722c0876..bb001ee9 100644 --- a/src/Saas.Lib/Saas.Identity/Crypto/ClientAssertionSigningProvider.cs +++ b/src/Saas.Lib/Saas.Identity/Crypto/ClientAssertionSigningProvider.cs @@ -63,7 +63,7 @@ public async Task GetClientAssertion( if (_memoryCache.TryGetValue(cacheItemName, out var clientAssertion) && clientAssertion is not null) { - _logger.LogInformation($"Cache item found.", cacheItemName); + _logger.LogInformation("Cache item found: {cacheItemName}", cacheItemName); return clientAssertion; } From 8f6026acdf8070768172a4584732fc5ecd1ae189 Mon Sep 17 00:00:00 2001 From: Jasper Hedegaard Bojsen Date: Wed, 27 Dec 2023 12:21:43 +0100 Subject: [PATCH 2/2] Leverage C# 12 --- .../Controllers/NewTenantRequest.cs | 2 +- .../Controllers/TenantDTO.cs | 17 ++++------- .../Controllers/TenantInfoDTO.cs | 2 +- .../Saas.Admin.Service/Data/Tenant.cs | 1 + .../Services/ITenantService.cs | 3 ++ .../Services/TenantService.cs | 15 +++------- .../CustomPrefixKeyVaultSecretManager.cs | 9 ++---- .../Saas.Application.Web/AppHttpContext.cs | 4 +-- .../Controllers/CustomClaimsController.cs | 14 +++------ .../Controllers/PermissionsController.cs | 19 ++++-------- .../Data/Context/SaasPermissionsContext.cs | 7 +---- .../Interfaces/IKeyVaultCredentialService.cs | 8 ----- .../Middleware/ApiKeyMiddleware.cs | 14 ++++----- .../Models/PermissionsClaimResponse.cs | 1 - .../Models/RolesClaimResponse.cs | 1 - .../Models/UnauthorizedResponse.cs | 2 -- .../Services/GraphAPIService.cs | 20 +++++-------- .../Services/GraphClientFactory.cs | 21 +++++-------- .../Services/PermissionsService.cs | 22 +++++--------- .../Attribute/SaasRequirementAttribute.cs | 9 ++---- .../SaasPermissionAuthorizationHandlerBase.cs | 16 ++++------ ...aasTenantPermissionAuthorizationHandler.cs | 9 ++---- .../SaasUserPermissionAuthorizationHandler.cs | 11 +++---- ...asPermissionAuthorizationPolicyProvider.cs | 9 ++---- .../Crypto/ClientAssertionSigningProvider.cs | 22 +++++--------- .../PublicX509CertificateDetailProvider.cs | 16 ++++------ ...ntityConfigurationBuilderExtensions.api.cs | 9 ++---- ...ntityConfigurationBuilderExtensions.app.cs | 16 ++++------ ...essionCookieWhenAccountNotInCacheEvents.cs | 9 ++---- .../SaasGraphClientCredentialsProvider.cs | 30 ++++--------------- .../Saas.Shared/Options/AdminApiOptions.cs | 1 - .../Saas.Shared/Options/SqlOptions.cs | 1 - 32 files changed, 98 insertions(+), 242 deletions(-) delete mode 100644 src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Interfaces/IKeyVaultCredentialService.cs diff --git a/src/Saas.Admin/Saas.Admin.Service/Controllers/NewTenantRequest.cs b/src/Saas.Admin/Saas.Admin.Service/Controllers/NewTenantRequest.cs index 449c4fb7..0d022560 100644 --- a/src/Saas.Admin/Saas.Admin.Service/Controllers/NewTenantRequest.cs +++ b/src/Saas.Admin/Saas.Admin.Service/Controllers/NewTenantRequest.cs @@ -12,7 +12,7 @@ public class NewTenantRequest internal Tenant ToTenant() { - Tenant tenant = new Tenant() + Tenant tenant = new() { Name = Name, Route = Route, diff --git a/src/Saas.Admin/Saas.Admin.Service/Controllers/TenantDTO.cs b/src/Saas.Admin/Saas.Admin.Service/Controllers/TenantDTO.cs index 0a0b466a..e687b94c 100644 --- a/src/Saas.Admin/Saas.Admin.Service/Controllers/TenantDTO.cs +++ b/src/Saas.Admin/Saas.Admin.Service/Controllers/TenantDTO.cs @@ -33,7 +33,7 @@ public TenantDTO(Tenant tenant) public Tenant ToTenant() { - Tenant tenant = new Tenant() + Tenant tenant = new() { Id = Id, Name = Name, @@ -68,16 +68,9 @@ public void CopyTo(Tenant target) public string? Version { get; set; } } -public class TenantDTOPage +public class TenantDTOPage(IEnumerable tenants, int totalCount, int startIndex) { - public TenantDTOPage(IEnumerable tenants, int totalCount, int startIndex) - { - Tenants = tenants; - TotalCount = totalCount; - StartIndex = startIndex; - } - - public IEnumerable Tenants { get; } - public int TotalCount { get; } - public int StartIndex { get; } + public IEnumerable Tenants { get; } = tenants; + public int TotalCount { get; } = totalCount; + public int StartIndex { get; } = startIndex; } diff --git a/src/Saas.Admin/Saas.Admin.Service/Controllers/TenantInfoDTO.cs b/src/Saas.Admin/Saas.Admin.Service/Controllers/TenantInfoDTO.cs index 9a1ec9ac..6f90687d 100644 --- a/src/Saas.Admin/Saas.Admin.Service/Controllers/TenantInfoDTO.cs +++ b/src/Saas.Admin/Saas.Admin.Service/Controllers/TenantInfoDTO.cs @@ -24,7 +24,7 @@ public TenantInfoDTO(Tenant? tenant) public Tenant ToTenant() { - Tenant tenant = new Tenant() + Tenant tenant = new() { Id = Id, Name = Name, diff --git a/src/Saas.Admin/Saas.Admin.Service/Data/Tenant.cs b/src/Saas.Admin/Saas.Admin.Service/Data/Tenant.cs index 91beabf8..6e63bd75 100644 --- a/src/Saas.Admin/Saas.Admin.Service/Data/Tenant.cs +++ b/src/Saas.Admin/Saas.Admin.Service/Data/Tenant.cs @@ -9,6 +9,7 @@ public class Tenant public int CategoryId { get; set; } public string CreatorEmail { get; set; } = string.Empty; public DateTime? CreatedTime { get; set; } + [Timestamp] public byte[]? ConcurrencyToken { get; set; } } diff --git a/src/Saas.Admin/Saas.Admin.Service/Services/ITenantService.cs b/src/Saas.Admin/Saas.Admin.Service/Services/ITenantService.cs index 6f22a83b..574d5e89 100644 --- a/src/Saas.Admin/Saas.Admin.Service/Services/ITenantService.cs +++ b/src/Saas.Admin/Saas.Admin.Service/Services/ITenantService.cs @@ -7,6 +7,7 @@ public interface ITenantService Task> GetAllTenantsAsync(); Task GetTenantAsync(Guid tenantId); + Task> GetTenantsByIdAsync(IEnumerable ids); Task AddTenantAsync(NewTenantRequest newTenantRequest, Guid adminId); @@ -16,6 +17,8 @@ public interface ITenantService Task DeleteTenantAsync(Guid tenantId); Task GetTenantInfoByRouteAsync(string route); + Task TenantExistsAsync(Guid tenantId); + Task CheckPathExists(string path); } diff --git a/src/Saas.Admin/Saas.Admin.Service/Services/TenantService.cs b/src/Saas.Admin/Saas.Admin.Service/Services/TenantService.cs index 72ec35af..146b5148 100644 --- a/src/Saas.Admin/Saas.Admin.Service/Services/TenantService.cs +++ b/src/Saas.Admin/Saas.Admin.Service/Services/TenantService.cs @@ -4,18 +4,11 @@ namespace Saas.Admin.Service.Services; -public class TenantService : ITenantService +public class TenantService(TenantsContext tenantContext, IPermissionsServiceClient permissionService, ILogger logger) : ITenantService { - private readonly TenantsContext _context; - private readonly IPermissionsServiceClient _permissionService; - private readonly ILogger _logger; - - public TenantService(TenantsContext tenantContext, IPermissionsServiceClient permissionService, ILogger logger) - { - _context = tenantContext; - _permissionService = permissionService; - _logger = logger; - } + private readonly TenantsContext _context = tenantContext; + private readonly IPermissionsServiceClient _permissionService = permissionService; + private readonly ILogger _logger = logger; public async Task> GetAllTenantsAsync() { diff --git a/src/Saas.Admin/Saas.Admin.Service/Utilities/CustomPrefixKeyVaultSecretManager.cs b/src/Saas.Admin/Saas.Admin.Service/Utilities/CustomPrefixKeyVaultSecretManager.cs index 692de46d..7a70b41e 100644 --- a/src/Saas.Admin/Saas.Admin.Service/Utilities/CustomPrefixKeyVaultSecretManager.cs +++ b/src/Saas.Admin/Saas.Admin.Service/Utilities/CustomPrefixKeyVaultSecretManager.cs @@ -5,14 +5,9 @@ namespace Saas.Admin.Service.Utilities; // This is to use key name prefixes to only load in the secrets that pertain to this microservice // https://docs.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-6.0#use-a-key-name-prefix -public class CustomPrefixKeyVaultSecretManager : KeyVaultSecretManager +public class CustomPrefixKeyVaultSecretManager(string prefix) : KeyVaultSecretManager { - private readonly string _prefix; - - public CustomPrefixKeyVaultSecretManager(string prefix) - { - _prefix = $"{prefix}-"; - } + private readonly string _prefix = $"{prefix}-"; public override bool Load(SecretProperties properties) { diff --git a/src/Saas.Application/Saas.Application.Web/AppHttpContext.cs b/src/Saas.Application/Saas.Application.Web/AppHttpContext.cs index dd853e44..79023918 100644 --- a/src/Saas.Application/Saas.Application.Web/AppHttpContext.cs +++ b/src/Saas.Application/Saas.Application.Web/AppHttpContext.cs @@ -15,7 +15,7 @@ public static IServiceProvider? Services } set { - if (services != null) + if (services is not null) { throw new Exception("Can't set once a value has already been set."); } @@ -31,7 +31,7 @@ public static HttpContext? Current { get { - if(services != null) + if(services is not null) { IHttpContextAccessor? httpContextAccessor = services.GetService(typeof(IHttpContextAccessor)) as IHttpContextAccessor; diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/CustomClaimsController.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/CustomClaimsController.cs index 6c5ab8b4..0016589c 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/CustomClaimsController.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/CustomClaimsController.cs @@ -5,16 +5,10 @@ namespace Saas.Permissions.Service.Controllers; [Route("api/[controller]")] [ApiController] -public class CustomClaimsController : ControllerBase +public class CustomClaimsController(IPermissionsService permissionsService, ILogger logger) : ControllerBase { - private readonly IPermissionsService _permissionsService; - private readonly ILogger _logger; - - public CustomClaimsController(IPermissionsService permissionsService, ILogger logger) - { - _permissionsService = permissionsService; - _logger = logger; - } + private readonly IPermissionsService _permissionsService = permissionsService; + private readonly ILogger _logger = logger; // This is the endpoint that is called by Azure AD B2C to get alle the custom claims defined for a specific user. [HttpPost("permissions")] @@ -74,7 +68,7 @@ public async Task Roles(ClaimsRequest request) RolesClaimResponse response = new() { - Roles = Array.Empty() + Roles = [] }; await Task.CompletedTask; diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/PermissionsController.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/PermissionsController.cs index bfe7fbad..284380e3 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/PermissionsController.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/PermissionsController.cs @@ -6,19 +6,14 @@ namespace Saas.Permissions.Service.Controllers; [Route("api/[controller]")] [ApiController] -public class PermissionsController : ControllerBase +public class PermissionsController( + IPermissionsService permissionsService, + IGraphAPIService graphAPIService, ILogger logger) : ControllerBase { - private readonly ILogger _logger; + private readonly ILogger _logger = logger; - private readonly IPermissionsService _permissionsService; - private readonly IGraphAPIService _graphAPIService; - - public PermissionsController(IPermissionsService permissionsService, IGraphAPIService graphAPIService, ILogger logger) - { - _permissionsService = permissionsService; - _graphAPIService = graphAPIService; - _logger = logger; - } + private readonly IPermissionsService _permissionsService = permissionsService; + private readonly IGraphAPIService _graphAPIService = graphAPIService; [HttpGet] [Produces("application/json")] @@ -229,7 +224,5 @@ public async Task GetUsersByIds(string[] userIds) throw; } } - - } diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Data/Context/SaasPermissionsContext.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Data/Context/SaasPermissionsContext.cs index 61e25d1b..c16e7e5b 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Data/Context/SaasPermissionsContext.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Data/Context/SaasPermissionsContext.cs @@ -3,13 +3,8 @@ namespace Saas.Permissions.Service.Data.Context; -public class SaasPermissionsContext : DbContext +public class SaasPermissionsContext(DbContextOptions options) : DbContext(options) { - public SaasPermissionsContext(DbContextOptions options) : base(options) - { - - } - public DbSet SaasPermissions { get; set; } public DbSet TenantPermissions { get; set; } public DbSet UserPermissions { get; set; } diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Interfaces/IKeyVaultCredentialService.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Interfaces/IKeyVaultCredentialService.cs deleted file mode 100644 index c2320021..00000000 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Interfaces/IKeyVaultCredentialService.cs +++ /dev/null @@ -1,8 +0,0 @@ -//using Azure.Core; - -//namespace Saas.Permissions.Service.Interfaces; - -//public interface IKeyVaultCredentialService -//{ -// TokenCredential GetCredential(); -//} diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Middleware/ApiKeyMiddleware.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Middleware/ApiKeyMiddleware.cs index fefe6ba8..7151b9a7 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Middleware/ApiKeyMiddleware.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Middleware/ApiKeyMiddleware.cs @@ -4,16 +4,12 @@ namespace Saas.Permissions.Service.Middleware; -public class ApiKeyMiddleware { - - private readonly RequestDelegate _next; +public class ApiKeyMiddleware(IOptions permissionOptions, RequestDelegate next) +{ + private readonly RequestDelegate _next = next; private const string API_KEY = "x-api-key"; - private readonly PermissionsApiOptions _permissionOptions; - - public ApiKeyMiddleware(IOptions permissionOptions, RequestDelegate next) { - _next = next; - _permissionOptions = permissionOptions.Value; - } + private readonly PermissionsApiOptions _permissionOptions = permissionOptions.Value; + public async Task InvokeAsync(HttpContext context) { if (!context.Request.Headers.TryGetValue(API_KEY, out var extractedApiKey)) { diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Models/PermissionsClaimResponse.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Models/PermissionsClaimResponse.cs index 6f319ac1..8c1ad2fd 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Models/PermissionsClaimResponse.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Models/PermissionsClaimResponse.cs @@ -1,6 +1,5 @@ namespace Saas.Permissions.Service.Models; - public record PermissionsClaimResponse { public string[]? Permissions { get; init; } diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Models/RolesClaimResponse.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Models/RolesClaimResponse.cs index 804fdb09..05c5e1f6 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Models/RolesClaimResponse.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Models/RolesClaimResponse.cs @@ -1,6 +1,5 @@ namespace Saas.Permissions.Service.Models; - public record RolesClaimResponse { public string[]? Roles { get; set; } diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Models/UnauthorizedResponse.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Models/UnauthorizedResponse.cs index 0410e0a7..677e755c 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Models/UnauthorizedResponse.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Models/UnauthorizedResponse.cs @@ -1,7 +1,5 @@ namespace Saas.Permissions.Service.Models; - - public record UnauthorizedResponse { public UnauthorizedResponse(string _error) diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Services/GraphAPIService.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Services/GraphAPIService.cs index e7305733..4b18cee7 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Services/GraphAPIService.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Services/GraphAPIService.cs @@ -9,9 +9,12 @@ namespace Saas.Permissions.Service.Services; -public class GraphAPIService : IGraphAPIService +public class GraphAPIService( + IOptions permissionApiOptions, + IGraphApiClientFactory graphClientFactory, + ILogger logger) : IGraphAPIService { - private readonly ILogger _logger; + private readonly ILogger _logger = logger; // https://learn.microsoft.com/en-us/aspnet/core/fundamentals/logging/loggermessage?view=aspnetcore-7.0 private static readonly Action _logError = LoggerMessage.Define( @@ -19,18 +22,9 @@ public class GraphAPIService : IGraphAPIService new EventId(1, nameof(GraphAPIService)), "Client Assertion Signing Provider"); - private readonly GraphServiceClient _graphServiceClient; - private readonly AzureB2CPermissionsApiOptions _permissionOptions; + private readonly GraphServiceClient _graphServiceClient = graphClientFactory.Create(); + private readonly AzureB2CPermissionsApiOptions _permissionOptions = permissionApiOptions.Value; - public GraphAPIService( - IOptions permissionApiOptions, - IGraphApiClientFactory graphClientFactory, - ILogger logger) - { - _logger= logger; - _graphServiceClient = graphClientFactory.Create(); - _permissionOptions = permissionApiOptions.Value; - } public async Task GetAppRolesAsync(ClaimsRequest request) { try diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Services/GraphClientFactory.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Services/GraphClientFactory.cs index 3aad86d5..c78b6d92 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Services/GraphClientFactory.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Services/GraphClientFactory.cs @@ -6,21 +6,14 @@ namespace Saas.Permissions.Service.Services; -public class GraphApiClientFactory : IGraphApiClientFactory +public class GraphApiClientFactory( + IOptions msGraphOptions, + IAuthenticationProvider authenticationProvider, + HttpClient httpClient) : IGraphApiClientFactory { - private readonly IAuthenticationProvider _authenticationProvider; - private readonly MSGraphOptions _msGraphOptions; - private readonly HttpClient _httpClient; - - public GraphApiClientFactory( - IOptions msGraphOptions, - IAuthenticationProvider authenticationProvider, - HttpClient httpClient) - { - _msGraphOptions = msGraphOptions.Value; - _authenticationProvider = authenticationProvider; - _httpClient = httpClient; - } + private readonly IAuthenticationProvider _authenticationProvider = authenticationProvider; + private readonly MSGraphOptions _msGraphOptions = msGraphOptions.Value; + private readonly HttpClient _httpClient = httpClient; public GraphServiceClient Create() => new(_httpClient, _authenticationProvider, _msGraphOptions.BaseUrl); diff --git a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Services/PermissionsService.cs b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Services/PermissionsService.cs index dee0a6c0..34bcf10e 100644 --- a/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Services/PermissionsService.cs +++ b/src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Services/PermissionsService.cs @@ -7,22 +7,14 @@ namespace Saas.Permissions.Service.Services; -public class PermissionsService : IPermissionsService +public class PermissionsService( + SaasPermissionsContext permissionsContext, + ILogger logger, + IGraphAPIService graphAPIService) : IPermissionsService { - private readonly SaasPermissionsContext _permissionsContext; - private readonly ILogger _logger; - private readonly IGraphAPIService _graphAPIService; - - public PermissionsService( - SaasPermissionsContext permissionsContext, - ILogger logger, - IGraphAPIService graphAPIService) - { - _permissionsContext = permissionsContext; - - _logger = logger; - _graphAPIService = graphAPIService; - } + private readonly SaasPermissionsContext _permissionsContext = permissionsContext; + private readonly ILogger _logger = logger; + private readonly IGraphAPIService _graphAPIService = graphAPIService; public async Task> GetPermissionsAsync(Guid userId) { diff --git a/src/Saas.Lib/Saas.Identity/Authorization/Attribute/SaasRequirementAttribute.cs b/src/Saas.Lib/Saas.Identity/Authorization/Attribute/SaasRequirementAttribute.cs index d329a297..d3eefd2e 100644 --- a/src/Saas.Lib/Saas.Identity/Authorization/Attribute/SaasRequirementAttribute.cs +++ b/src/Saas.Lib/Saas.Identity/Authorization/Attribute/SaasRequirementAttribute.cs @@ -2,12 +2,7 @@ namespace Saas.Identity.Authorization.Attribute; [AttributeUsage(AttributeTargets.Class)] -public class SaasRequirementAttribute : System.Attribute +public class SaasRequirementAttribute(string name) : System.Attribute { - public string PermissionEntityName { get; } - - public SaasRequirementAttribute(string name) - { - PermissionEntityName = name; - } + public string PermissionEntityName { get; } = name; } diff --git a/src/Saas.Lib/Saas.Identity/Authorization/Handler/SaasPermissionAuthorizationHandlerBase.cs b/src/Saas.Lib/Saas.Identity/Authorization/Handler/SaasPermissionAuthorizationHandlerBase.cs index a255228e..19f5fdc2 100644 --- a/src/Saas.Lib/Saas.Identity/Authorization/Handler/SaasPermissionAuthorizationHandlerBase.cs +++ b/src/Saas.Lib/Saas.Identity/Authorization/Handler/SaasPermissionAuthorizationHandlerBase.cs @@ -9,21 +9,15 @@ using System.Security.Claims; namespace Saas.Identity.Authorization.Handler; -public abstract class SaasPermissionAuthorizationHandlerBase : AuthorizationHandler +public abstract class SaasPermissionAuthorizationHandlerBase( + IHttpContextAccessor httpContextAccessor, + IOptions saasAuthorizationOptions) : AuthorizationHandler where TSaasRequirement : ISaasRequirement where TSaasPermissionKind : struct, Enum { - protected readonly IHttpContextAccessor _httpContextAccessor; - protected readonly Guid _globalEntity; - - public SaasPermissionAuthorizationHandlerBase( - IHttpContextAccessor httpContextAccessor, - IOptions saasAuthorizationOptions) - { - _httpContextAccessor = httpContextAccessor; - _globalEntity = saasAuthorizationOptions?.Value.Global + protected readonly IHttpContextAccessor _httpContextAccessor = httpContextAccessor; + protected readonly Guid _globalEntity = saasAuthorizationOptions?.Value.Global ?? throw new InvalidOperationException($"Global entity guid in '{nameof(saasAuthorizationOptions)}' cannot be null and must be defined."); - } protected virtual HashSet GetGrantedPermissionValues(AuthorizationHandlerContext context, TSaasRequirement requirement) { diff --git a/src/Saas.Lib/Saas.Identity/Authorization/Handler/SaasTenantPermissionAuthorizationHandler.cs b/src/Saas.Lib/Saas.Identity/Authorization/Handler/SaasTenantPermissionAuthorizationHandler.cs index fe8e4bc1..f5d9d4d8 100644 --- a/src/Saas.Lib/Saas.Identity/Authorization/Handler/SaasTenantPermissionAuthorizationHandler.cs +++ b/src/Saas.Lib/Saas.Identity/Authorization/Handler/SaasTenantPermissionAuthorizationHandler.cs @@ -5,11 +5,8 @@ using Saas.Identity.Authorization.Requirement; namespace Saas.Identity.Authorization.Handler; -public sealed class SaasTenantPermissionAuthorizationHandler : SaasPermissionAuthorizationHandlerBase +public sealed class SaasTenantPermissionAuthorizationHandler( + IHttpContextAccessor httpContextAccessor, + IOptions saasAuthorizationOptions) : SaasPermissionAuthorizationHandlerBase(httpContextAccessor, saasAuthorizationOptions) { - public SaasTenantPermissionAuthorizationHandler( - IHttpContextAccessor httpContextAccessor, - IOptions saasAuthorizationOptions) : base(httpContextAccessor, saasAuthorizationOptions) - { - } } diff --git a/src/Saas.Lib/Saas.Identity/Authorization/Handler/SaasUserPermissionAuthorizationHandler.cs b/src/Saas.Lib/Saas.Identity/Authorization/Handler/SaasUserPermissionAuthorizationHandler.cs index 73c50f9c..db49b33a 100644 --- a/src/Saas.Lib/Saas.Identity/Authorization/Handler/SaasUserPermissionAuthorizationHandler.cs +++ b/src/Saas.Lib/Saas.Identity/Authorization/Handler/SaasUserPermissionAuthorizationHandler.cs @@ -8,14 +8,11 @@ using System.Security.Claims; namespace Saas.Identity.Authorization.Handler; -public sealed class SaasUserPermissionAuthorizationHandler : SaasPermissionAuthorizationHandlerBase +public sealed class SaasUserPermissionAuthorizationHandler( + IHttpContextAccessor httpContextAccessor, + IOptions saasAuthorizationOptions) + : SaasPermissionAuthorizationHandlerBase(httpContextAccessor, saasAuthorizationOptions) { - public SaasUserPermissionAuthorizationHandler( - IHttpContextAccessor httpContextAccessor, - IOptions saasAuthorizationOptions) : base(httpContextAccessor, saasAuthorizationOptions) - { - } - protected override bool IsValidPermission( SaasPermissionClaim permission, AuthorizationHandlerContext context, diff --git a/src/Saas.Lib/Saas.Identity/Authorization/Provider/SaasPermissionAuthorizationPolicyProvider.cs b/src/Saas.Lib/Saas.Identity/Authorization/Provider/SaasPermissionAuthorizationPolicyProvider.cs index 997716d4..9b7d498a 100644 --- a/src/Saas.Lib/Saas.Identity/Authorization/Provider/SaasPermissionAuthorizationPolicyProvider.cs +++ b/src/Saas.Lib/Saas.Identity/Authorization/Provider/SaasPermissionAuthorizationPolicyProvider.cs @@ -6,14 +6,9 @@ using System.Reflection; namespace Saas.Identity.Authorization.Provider; -public class SaasPermissionAuthorizationPolicyProvider : DefaultAuthorizationPolicyProvider +public class SaasPermissionAuthorizationPolicyProvider( + IOptions options) : DefaultAuthorizationPolicyProvider(options) { - public SaasPermissionAuthorizationPolicyProvider( - IOptions options) : base(options) - { - - } - public override async Task GetPolicyAsync(string policyName) { AuthorizationPolicy? policy = await base.GetPolicyAsync(policyName); diff --git a/src/Saas.Lib/Saas.Identity/Crypto/ClientAssertionSigningProvider.cs b/src/Saas.Lib/Saas.Identity/Crypto/ClientAssertionSigningProvider.cs index bb001ee9..aa106af5 100644 --- a/src/Saas.Lib/Saas.Identity/Crypto/ClientAssertionSigningProvider.cs +++ b/src/Saas.Lib/Saas.Identity/Crypto/ClientAssertionSigningProvider.cs @@ -14,9 +14,12 @@ using Saas.Identity.Crypto.Util; namespace Saas.Identity.Crypto; -public class ClientAssertionSigningProvider : IClientAssertionSigningProvider +public class ClientAssertionSigningProvider( + IMemoryCache menoryCache, + ILogger logger, + IPublicX509CertificateDetailProvider publicX509CertificateDetailProvider) : IClientAssertionSigningProvider { - private readonly ILogger _logger; + private readonly ILogger _logger = logger; // https://learn.microsoft.com/en-us/aspnet/core/fundamentals/logging/loggermessage?view=aspnetcore-7.0 private static readonly Action _logError = LoggerMessage.Define( @@ -24,19 +27,8 @@ public class ClientAssertionSigningProvider : IClientAssertionSigningProvider new EventId(1, nameof(ClientAssertionSigningProvider)), "Client Assertion Signing Provider"); - private readonly IMemoryCache _memoryCache; - private readonly IPublicX509CertificateDetailProvider _publicX509CertificateDetailProvider; - - public ClientAssertionSigningProvider( - IMemoryCache menoryCache, - ILogger logger, - IPublicX509CertificateDetailProvider publicX509CertificateDetailProvider) - { - _logger = logger; - _memoryCache = menoryCache; - - _publicX509CertificateDetailProvider = publicX509CertificateDetailProvider; - } + private readonly IMemoryCache _memoryCache = menoryCache; + private readonly IPublicX509CertificateDetailProvider _publicX509CertificateDetailProvider = publicX509CertificateDetailProvider; public async Task GetClientAssertion(string keyVaultUrl, string certKeyName, diff --git a/src/Saas.Lib/Saas.Identity/Crypto/PublicX509CertificateDetailProvider.cs b/src/Saas.Lib/Saas.Identity/Crypto/PublicX509CertificateDetailProvider.cs index 39ff61ea..c11d9837 100644 --- a/src/Saas.Lib/Saas.Identity/Crypto/PublicX509CertificateDetailProvider.cs +++ b/src/Saas.Lib/Saas.Identity/Crypto/PublicX509CertificateDetailProvider.cs @@ -9,9 +9,11 @@ using Saas.Identity.Crypto.Util; namespace Saas.Identity.Crypto; -public class PublicX509CertificateDetailProvider : IPublicX509CertificateDetailProvider +public class PublicX509CertificateDetailProvider( + IMemoryCache memoryCache, + ILogger logger) : IPublicX509CertificateDetailProvider { - private readonly ILogger _logger; + private readonly ILogger _logger = logger; // https://learn.microsoft.com/en-us/aspnet/core/fundamentals/logging/loggermessage?view=aspnetcore-7.0 private static readonly Action _logError = LoggerMessage.Define( @@ -19,15 +21,7 @@ public class PublicX509CertificateDetailProvider : IPublicX509CertificateDetailP new EventId(1, nameof(PublicX509CertificateDetailProvider)), "Client Assertion Signing Provider"); - private readonly IMemoryCache _memoryCache; - - public PublicX509CertificateDetailProvider( - IMemoryCache memoryCache, - ILogger logger) - { - _memoryCache = memoryCache; - _logger = logger; - } + private readonly IMemoryCache _memoryCache = memoryCache; public async Task GetX509Detail(IKeyVaultInfo keyInfo, TokenCredential credential) { diff --git a/src/Saas.Lib/Saas.Identity/Extensions/SaasIdentityConfigurationBuilderExtensions.api.cs b/src/Saas.Lib/Saas.Identity/Extensions/SaasIdentityConfigurationBuilderExtensions.api.cs index e14d7be1..d9b9c093 100644 --- a/src/Saas.Lib/Saas.Identity/Extensions/SaasIdentityConfigurationBuilderExtensions.api.cs +++ b/src/Saas.Lib/Saas.Identity/Extensions/SaasIdentityConfigurationBuilderExtensions.api.cs @@ -45,16 +45,11 @@ public static SaasApiClientCredentialBuilder AddSaasApiCert } } -public class SaasApiClientCredentialBuilder +public class SaasApiClientCredentialBuilder(IServiceCollection services) where TProvider : ISaasApi where TOptions : AzureAdB2CBase { - private readonly IServiceCollection _services; - - public SaasApiClientCredentialBuilder(IServiceCollection services) - { - _services = services; - } + private readonly IServiceCollection _services = services; public IServiceCollection AddMicrosoftGraphAuthenticationProvider() { diff --git a/src/Saas.Lib/Saas.Identity/Extensions/SaasIdentityConfigurationBuilderExtensions.app.cs b/src/Saas.Lib/Saas.Identity/Extensions/SaasIdentityConfigurationBuilderExtensions.app.cs index 649012b4..f754d6b9 100644 --- a/src/Saas.Lib/Saas.Identity/Extensions/SaasIdentityConfigurationBuilderExtensions.app.cs +++ b/src/Saas.Lib/Saas.Identity/Extensions/SaasIdentityConfigurationBuilderExtensions.app.cs @@ -43,18 +43,12 @@ public static SaasWebAppClientCredentialBuilder AddSaasWebAppAuthentication( return new SaasWebAppClientCredentialBuilder(authenticationBuilder, scopes); } - public class SaasWebAppClientCredentialBuilder + public class SaasWebAppClientCredentialBuilder( + MicrosoftIdentityWebAppAuthenticationBuilder authenticationBuilder, + IEnumerable scopes) { - private readonly MicrosoftIdentityWebAppAuthenticationBuilder _authenticationBuilder; - private readonly IEnumerable _scopes; - - public SaasWebAppClientCredentialBuilder( - MicrosoftIdentityWebAppAuthenticationBuilder authenticationBuilder, - IEnumerable scopes) - { - _authenticationBuilder= authenticationBuilder; - _scopes= scopes; - } + private readonly MicrosoftIdentityWebAppAuthenticationBuilder _authenticationBuilder = authenticationBuilder; + private readonly IEnumerable _scopes = scopes; public MicrosoftIdentityAppCallsWebApiAuthenticationBuilder SaaSAppCallDownstreamApi(IEnumerable? scopes = default) { diff --git a/src/Saas.Lib/Saas.Identity/Helper/RejectSessionCookieWhenAccountNotInCacheEvents.cs b/src/Saas.Lib/Saas.Identity/Helper/RejectSessionCookieWhenAccountNotInCacheEvents.cs index 43477ed8..0759cbe9 100644 --- a/src/Saas.Lib/Saas.Identity/Helper/RejectSessionCookieWhenAccountNotInCacheEvents.cs +++ b/src/Saas.Lib/Saas.Identity/Helper/RejectSessionCookieWhenAccountNotInCacheEvents.cs @@ -6,14 +6,9 @@ namespace Saas.Identity.Helper; // For more details please see: https://github.com/AzureAD/microsoft-identity-web/issues/13#issuecomment-878528492 -public class RejectSessionCookieWhenAccountNotInCacheEvents : CookieAuthenticationEvents +public class RejectSessionCookieWhenAccountNotInCacheEvents(IEnumerable scopes) : CookieAuthenticationEvents { - private readonly IEnumerable _scopes; - - public RejectSessionCookieWhenAccountNotInCacheEvents(IEnumerable scopes) - { - _scopes = scopes; - } + private readonly IEnumerable _scopes = scopes; public async override Task ValidatePrincipal(CookieValidatePrincipalContext context) { diff --git a/src/Saas.Lib/Saas.Identity/Provider/SaasGraphClientCredentialsProvider.cs b/src/Saas.Lib/Saas.Identity/Provider/SaasGraphClientCredentialsProvider.cs index 3d665c26..94b519fe 100644 --- a/src/Saas.Lib/Saas.Identity/Provider/SaasGraphClientCredentialsProvider.cs +++ b/src/Saas.Lib/Saas.Identity/Provider/SaasGraphClientCredentialsProvider.cs @@ -6,11 +6,13 @@ using Saas.Shared.Options; namespace Saas.Identity.Provider; -public class SaasGraphClientCredentialsProvider : IAuthenticationProvider +public class SaasGraphClientCredentialsProvider( + SaasApiAuthenticationProvider authProvider, + ILogger> logger) : IAuthenticationProvider where TOptions : AzureAdB2CBase { - private readonly ILogger _logger; - private readonly SaasApiAuthenticationProvider _authProvider; + private readonly ILogger _logger = logger; + private readonly SaasApiAuthenticationProvider _authProvider = authProvider; // https://learn.microsoft.com/en-us/aspnet/core/fundamentals/logging/loggermessage?view=aspnetcore-7.0 private static readonly Action _logError = LoggerMessage.Define( @@ -18,28 +20,6 @@ public class SaasGraphClientCredentialsProvider : IAuthenticationProvi new EventId(1, nameof(SaasGraphClientCredentialsProvider)), "Client Assertion Signing Provider"); - public SaasGraphClientCredentialsProvider( - SaasApiAuthenticationProvider authProvider, - ILogger> logger) - { - _logger = logger; - _authProvider = authProvider; - } - - //public async Task AuthenticateRequestAsync(HttpRequestMessage requestMessage) - //{ - // try - // { - // requestMessage.Headers.Authorization = - // new AuthenticationHeaderValue("bearer", await _authProvider.GetAccessTokenAsync()); - // } - // catch (Exception ex) - // { - // _logError(_logger, ex); - // throw; - // } - //} - public async Task AuthenticateRequestAsync( RequestInformation request, Dictionary? additionalAuthenticationContext = null, diff --git a/src/Saas.Lib/Saas.Shared/Options/AdminApiOptions.cs b/src/Saas.Lib/Saas.Shared/Options/AdminApiOptions.cs index 0d6ab25c..a5a1101f 100644 --- a/src/Saas.Lib/Saas.Shared/Options/AdminApiOptions.cs +++ b/src/Saas.Lib/Saas.Shared/Options/AdminApiOptions.cs @@ -7,5 +7,4 @@ public record AdminApiOptions public string? ApplicationIdUri { get; init; } public string[]? Scopes { get; init; } - } diff --git a/src/Saas.Lib/Saas.Shared/Options/SqlOptions.cs b/src/Saas.Lib/Saas.Shared/Options/SqlOptions.cs index 68532c8b..59bf8d22 100644 --- a/src/Saas.Lib/Saas.Shared/Options/SqlOptions.cs +++ b/src/Saas.Lib/Saas.Shared/Options/SqlOptions.cs @@ -7,5 +7,4 @@ public record SqlOptions public string? SQLAdministratorLoginName { get; init; } public string? TenantSQLConnectionString { get; init; } public string? PermissionsSQLConnectionString { get; init; } - }