Implementierung von DirectorySearchService für Active Directory-Suchen. Unterstützt Caching und Konfiguration für Suchfunktionalität.
This commit is contained in:
56
DigitalData.Core.Application/DirectorySearchService.cs
Normal file
56
DigitalData.Core.Application/DirectorySearchService.cs
Normal file
@@ -0,0 +1,56 @@
|
||||
using DigitalData.Core.Contracts.Application;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System.Configuration;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.DirectoryServices;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
|
||||
namespace DigitalData.Core.Application
|
||||
{
|
||||
[SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>")]
|
||||
public class DirectorySearchService : ServiceBase, IDirectorySearchService
|
||||
{
|
||||
private readonly IMemoryCache _memoryCache;
|
||||
public readonly string SearchRootPath;
|
||||
|
||||
public DirectorySearchService(IConfiguration configuration, ILogger<DirectoryService> logger, IMemoryCache memoryCache)
|
||||
{
|
||||
SearchRootPath = configuration["DirectorySearch:SearchRootPath"] ?? throw new ConfigurationErrorsException("SearchRootPath configuration is missing.");
|
||||
_memoryCache = memoryCache;
|
||||
}
|
||||
|
||||
public IServiceResult<IEnumerable<ResultPropertyCollection>> FindAll(DirectoryEntry searchRoot, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000)
|
||||
{
|
||||
List<ResultPropertyCollection> list = new();
|
||||
|
||||
var searcher = new DirectorySearcher()
|
||||
{
|
||||
Filter = filter,
|
||||
SearchScope = searchScope,
|
||||
SizeLimit = sizeLimit,
|
||||
SearchRoot = searchRoot
|
||||
};
|
||||
|
||||
foreach (SearchResult result in searcher.FindAll())
|
||||
{
|
||||
ResultPropertyCollection rpc = result.Properties;
|
||||
list.Add(rpc);
|
||||
}
|
||||
|
||||
return Successful<IEnumerable<ResultPropertyCollection>>(list);
|
||||
}
|
||||
|
||||
public IServiceResult<IEnumerable<ResultPropertyCollection>> FindAllByUserCache(string username, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000)
|
||||
{
|
||||
List<ResultPropertyCollection> list = new();
|
||||
|
||||
_memoryCache.TryGetValue(username, out DirectoryEntry? searchRoot);
|
||||
|
||||
if (searchRoot is null)
|
||||
return Failed<IEnumerable<ResultPropertyCollection>>(MessageKey.DirSearcherDisconnected.ToString());
|
||||
|
||||
return FindAll(searchRoot, filter, searchScope, sizeLimit);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user