diff --git a/src/DigitalData.ActiveDirectory.API/Program.cs b/src/DigitalData.ActiveDirectory.API/Program.cs index 9a33468..bf15764 100644 --- a/src/DigitalData.ActiveDirectory.API/Program.cs +++ b/src/DigitalData.ActiveDirectory.API/Program.cs @@ -1,3 +1,4 @@ +using DigitalData.ActiveDirectory; using DigitalData.ActiveDirectory.API.Middleware; var builder = WebApplication.CreateBuilder(args); @@ -9,6 +10,12 @@ builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); +builder.Services.AddActiveDirectory(options => +{ + options.ConfigActiveDirectory(builder.Configuration.GetSection("ActiveDirectory")); + options.MediatRLicenseKey = builder.Configuration["MediatRLicense"]; +}); + var app = builder.Build(); app.UseMiddleware(); diff --git a/src/DigitalData.ActiveDirectory.API/appsettings.json b/src/DigitalData.ActiveDirectory.API/appsettings.json index 10f68b8..cf261e8 100644 --- a/src/DigitalData.ActiveDirectory.API/appsettings.json +++ b/src/DigitalData.ActiveDirectory.API/appsettings.json @@ -5,5 +5,11 @@ "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "ActiveDirectory": { + "Path": "LDAP://DD-VMP01-DC01/DC=dd-gan,DC=local,DC=digitaldata,DC=works", + "Username": "FABRIK19-User01", + "Password": "9bWOr0UGuHn_7VkC" + }, + "MediatRLicense": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ikx1Y2t5UGVubnlTb2Z0d2FyZUxpY2Vuc2VLZXkvYmJiMTNhY2I1OTkwNGQ4OWI0Y2IxYzg1ZjA4OGNjZjkiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2x1Y2t5cGVubnlzb2Z0d2FyZS5jb20iLCJhdWQiOiJMdWNreVBlbm55U29mdHdhcmUiLCJleHAiOiIxNzg0ODUxMjAwIiwiaWF0IjoiMTc1MzM2MjQ5MSIsImFjY291bnRfaWQiOiIwMTk4M2M1OWU0YjM3MjhlYmZkMzEwM2MyYTQ4NmU4NSIsImN1c3RvbWVyX2lkIjoiY3RtXzAxazB5NmV3MmQ4YTk4Mzg3aDJnbTRuOWswIiwic3ViX2lkIjoiLSIsImVkaXRpb24iOiIwIiwidHlwZSI6IjIifQ.ZqsFG7kv_-xGfxS6ACk3i0iuNiVUXX2AvPI8iAcZ6-z2170lGv__aO32tWpQccD9LCv5931lBNLWSblKS0MT3gOt-5he2TEftwiSQGFwoIBgtOHWsNRMinUrg2trceSp3IhyS3UaMwnxZDrCvx4-0O-kpOzVpizeHUAZNr5U7oSCWO34bpKdae6grtM5e3f93Z1vs7BW_iPgItd-aLvPwApbaG9VhmBTKlQ7b4Jh64y7UXJ9mKP7Qb_Oa97oEg0oY5DPHOWTZWeE1EzORgVr2qkK2DELSHuZ_EIUhODojkClPNAKtvEl_qEjpq0HZCIvGwfCCRlKlSkQqIeZdFkiXg" } diff --git a/src/DigitalData.ActiveDirectory/DependencyInjection.cs b/src/DigitalData.ActiveDirectory/DependencyInjection.cs index 5ef9f6f..87f5df7 100644 --- a/src/DigitalData.ActiveDirectory/DependencyInjection.cs +++ b/src/DigitalData.ActiveDirectory/DependencyInjection.cs @@ -7,7 +7,7 @@ public static class DependencyInjection { public static IServiceCollection AddActiveDirectory(this IServiceCollection services, Action? options = null) { - var cOptions = new ADConfigurationOptions(); + var cOptions = new ADConfigurationOptions(services); options?.Invoke(cOptions); services.AddMediatR(cfg => @@ -16,20 +16,32 @@ public static class DependencyInjection cfg.LicenseKey = cOptions.MediatRLicenseKey; }); - if (cOptions.Configuration is null) - services.Configure(o => o = cOptions); - else - services.Configure(cOptions.Configuration); + if (!cOptions.IsADConfigured) + services.Configure(_ => { }); return services; } public class ADConfigurationOptions : ActiveDirectoryOptions { - internal ADConfigurationOptions() { } + private readonly IServiceCollection _services; + + internal bool IsADConfigured { get; private set; } = false; + + internal ADConfigurationOptions(IServiceCollection services) => _services = services; public string? MediatRLicenseKey { get; set; } - public IConfiguration? Configuration { get; set; } + private void EnsureSingleMappingConfiguration(Action action) + { + if (IsADConfigured) + throw new InvalidOperationException("Mapping configuration has already been set."); + action(); + IsADConfigured = true; + } + + public void ConfigActiveDirectory(IConfiguration config) => EnsureSingleMappingConfiguration(() => _services.Configure(config)); + + public void ConfigActiveDirectory(Action options) => EnsureSingleMappingConfiguration(() => _services.Configure(options)); } } \ No newline at end of file diff --git a/src/DigitalData.ActiveDirectory/DirectorySearchQuery.cs b/src/DigitalData.ActiveDirectory/DirectorySearchQuery.cs index 618ee6d..3049279 100644 --- a/src/DigitalData.ActiveDirectory/DirectorySearchQuery.cs +++ b/src/DigitalData.ActiveDirectory/DirectorySearchQuery.cs @@ -12,14 +12,20 @@ public record DirectorySearchQuery(string? Filter = null, SearchScope Scope = Se } [System.Diagnostics.CodeAnalysis.SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "")] -public class DirectorySearchQueryHandler(IOptions options) : IRequestHandler> +public class DirectorySearchQueryHandler : IRequestHandler> { - + private readonly IOptions _options; + + public DirectorySearchQueryHandler(IOptions options) + { + _options = options; + } + public DirectoryEntry DirectoryEntry => new () { - Path = options.Value.Path, - Username = options.Value.Username, - Password = options.Value.Password + Path = _options.Value.Path, + Username = _options.Value.Username, + Password = _options.Value.Password }; public Task> Handle(DirectorySearchQuery request, CancellationToken cancellationToken = default)