Compare commits

...

3 Commits

Author SHA1 Message Date
d2180c912b chore: update the version of AutoMapper
- update controller to return iactionresult
2025-08-04 15:27:38 +02:00
c178aa7fba chore: arrange dependency versions 2025-08-04 15:16:37 +02:00
6bc96205ce chore: ADConfigurationOptions mit appsettings verknüpfen 2025-08-04 15:03:56 +02:00
6 changed files with 60 additions and 21 deletions

View File

@@ -1,9 +1,7 @@
using MediatR;
using Microsoft.AspNetCore.Mvc;
using System.DirectoryServices;
namespace DigitalData.ActiveDirectory.API.Controllers;
[System.Diagnostics.CodeAnalysis.SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>")]
[Route("api/[controller]")]
[ApiController]
public class ActiveDirectoryController : ControllerBase
@@ -16,5 +14,5 @@ public class ActiveDirectoryController : ControllerBase
}
[HttpGet]
public async Task<IEnumerable<ResultPropertyCollection>> GetAll([FromQuery] DirectorySearchQuery query) => await _mediator.Send(query);
public async Task<IActionResult> GetAll([FromQuery] DirectorySearchQuery query) => Ok(await _mediator.Send(query));
}

View File

@@ -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<ExceptionHandlingMiddleware>();

View File

@@ -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"
}

View File

@@ -7,7 +7,7 @@ public static class DependencyInjection
{
public static IServiceCollection AddActiveDirectory(this IServiceCollection services, Action<ADConfigurationOptions>? 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<ActiveDirectoryOptions>(o => o = cOptions);
else
services.Configure<ActiveDirectoryOptions>(cOptions.Configuration);
if (!cOptions.IsADConfigured)
services.Configure<ActiveDirectoryOptions>(_ => { });
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<ActiveDirectoryOptions>(config));
public void ConfigActiveDirectory(Action<ActiveDirectoryOptions> options) => EnsureSingleMappingConfiguration(() => _services.Configure(options));
}
}

View File

@@ -8,26 +8,36 @@
<ItemGroup>
<PackageReference Include="DigitalData.Core.Exceptions" Version="1.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />
<PackageReference Include="System.DirectoryServices.AccountManagement" Version="7.0.1" />
<PackageReference Include="MediatR" Version="13.0.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />
<PackageReference Include="System.DirectoryServices.AccountManagement" Version="7.0.1" />
<PackageReference Include="MediatR" Version="13.0.0" />
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
<PackageReference Include="System.DirectoryServices.AccountManagement" Version="8.0.1" />
<PackageReference Include="MediatR" Version="13.0.0" />
<PackageReference Include="AutoMapper" Version="14.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.7" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.7" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.7" />
<PackageReference Include="System.DirectoryServices.AccountManagement" Version="9.0.7" />
<PackageReference Include="MediatR" Version="13.0.0" />
<PackageReference Include="AutoMapper" Version="14.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.5" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.5" />

View File

@@ -12,14 +12,20 @@ public record DirectorySearchQuery(string? Filter = null, SearchScope Scope = Se
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>")]
public class DirectorySearchQueryHandler(IOptions<ActiveDirectoryOptions> options) : IRequestHandler<DirectorySearchQuery, IEnumerable<ResultPropertyCollection>>
public class DirectorySearchQueryHandler : IRequestHandler<DirectorySearchQuery, IEnumerable<ResultPropertyCollection>>
{
private readonly IOptions<ActiveDirectoryOptions> _options;
public DirectorySearchQueryHandler(IOptions<ActiveDirectoryOptions> 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<IEnumerable<ResultPropertyCollection>> Handle(DirectorySearchQuery request, CancellationToken cancellationToken = default)