ActiveDirectoryClient (0.2.0)
Installation
dotnet nuget add source --name Jannes --username your_username --password your_token dotnet add package --source Jannes --version 0.2.0 ActiveDirectoryClientAbout this package
A comprehensive .NET library for Active Directory user management using LDAP, with built-in abstraction for easy mocking and testing. Supports full CRUD operations, authentication, and includes a mock implementation for testing.
Active Directory Client Library
A comprehensive .NET library for Active Directory user management using LDAP, with built-in abstraction for easy mocking and testing.
Features
- ✅ Full LDAP Support: Built on System.DirectoryServices.Protocols for robust AD connectivity
- ✅ Complete User Management: Create, read, update, and delete AD users
- ✅ User Authentication: Authenticate users against Active Directory
- ✅ Easy Abstraction:
IActiveDirectoryClientinterface for dependency injection - ✅ Mock Implementation: Built-in
MockActiveDirectoryClientfor testing without AD - ✅ XML Documentation: Comprehensive XML docs for all public APIs
- ✅ Test-Driven Development: Built following TDD principles with TUnit tests
- ✅ Dependency Injection: Easy integration with .NET DI container
Installation
dotnet add package ActiveDirectoryClient
Quick Start
Configuration
Add Active Directory settings to your appsettings.json:
{
"ActiveDirectory": {
"LdapServer": "ldap.example.com",
"LdapPort": 389,
"UseSsl": false,
"UseStartTls": false,
"BaseDn": "DC=example,DC=com",
"BindDn": "CN=admin,CN=Users,DC=example,DC=com",
"BindPassword": "your-password",
"DefaultUserOu": "OU=Users,DC=example,DC=com",
"TimeoutSeconds": 30,
"FilterSettings": {
"UsernameAttribute": "sAMAccountName",
"EmailAttribute": "mail"
}
}
}
Register Services
using ActiveDirectoryClient.Extensions;
// In your Program.cs or Startup.cs
builder.Services.AddActiveDirectory(
builder.Configuration.GetSection("ActiveDirectory")
);
// Or with inline configuration
builder.Services.AddActiveDirectory(options =>
{
options.LdapServer = "ldap.example.com";
options.LdapPort = 389;
options.BaseDn = "DC=example,DC=com";
options.BindDn = "CN=admin,CN=Users,DC=example,DC=com";
options.BindPassword = "password";
});
Use the Client
using ActiveDirectoryClient.Abstractions;
using ActiveDirectoryClient.Models;
public class UserService
{
private readonly IActiveDirectoryClient _adClient;
public UserService(IActiveDirectoryClient adClient)
{
_adClient = adClient;
}
public async Task<AdUser?> GetUser(string username)
{
return await _adClient.GetUserByUsernameAsync(username);
}
public async Task<bool> AuthenticateUser(string username, string password)
{
return await _adClient.AuthenticateUserAsync(username, password);
}
public async Task<AdUser> CreateNewUser(string username, string password, string email)
{
var request = new CreateUserRequest
{
Username = username,
Password = password,
Email = email,
FirstName = "John",
LastName = "Doe",
IsEnabled = true
};
return await _adClient.CreateUserAsync(request);
}
}
API Reference
IActiveDirectoryClient Interface
User Retrieval
GetUserByUsernameAsync(string username)- Get user by username (sAMAccountName)GetUserByEmailAsync(string email)- Get user by email addressGetAllUsersAsync()- Retrieve all users from ADUserExistsAsync(string username)- Check if a user exists
User Management
CreateUserAsync(CreateUserRequest request)- Create a new AD userUpdateUserAsync(string username, UpdateUserRequest request)- Update an existing userDeleteUserAsync(string username)- Delete a user from AD
Authentication
AuthenticateUserAsync(string username, string password)- Authenticate user credentials
Models
AdUser
Represents an Active Directory user with properties:
Username- sAMAccountNameDistinguishedName- Full DNMemberOf- Group membershipsEmail- Email addressFirstName- Given nameLastName- SurnameDisplayName- Display nameUserPrincipalName- UPNIsEnabled- Account statusOrganizationalUnit- OU pathTelephoneNumber- Phone numberTitle- Job titleDepartment- Department
CreateUserRequest
Request model for creating users with all AD user properties.
UpdateUserRequest
Request model for updating user properties (all fields optional).
Testing
Using the Mock Implementation
For unit testing, use the built-in mock client:
using ActiveDirectoryClient.Extensions;
// In your test setup
builder.Services.AddMockActiveDirectory();
// Or with custom configuration
builder.Services.AddMockActiveDirectory(mock =>
{
mock.AddUser(new AdUser
{
Username = "testuser",
Email = "test@example.com",
FirstName = "Test",
LastName = "User"
}, "password123");
});
Running Tests
dotnet test
The project includes comprehensive TUnit tests covering:
- User retrieval operations
- User management (CRUD)
- Authentication
- Error handling
Architecture
The library follows clean architecture principles:
┌─────────────────────────────────────┐
│ IActiveDirectoryClient │ (Abstraction)
└─────────────────────────────────────┘
↑
│ implements
┌───────────┴───────────────┐
│ │
┌─────────────────────┐ ┌──────────────────────┐
│ LdapActiveDirectory │ │ MockActiveDirectory │
│ Client │ │ Client │
└─────────────────────┘ └──────────────────────┘
(Production) (Testing)
Key Components
- Abstractions:
IActiveDirectoryClientinterface - Implementations:
LdapActiveDirectoryClient- Production LDAP implementationMockActiveDirectoryClient- In-memory mock for testing
- Models: DTOs for users and requests
- Configuration:
ActiveDirectoryOptionsfor LDAP settings - Extensions: DI registration helpers
Advanced Usage
SSL/TLS Connection
options.UseSsl = true;
options.LdapPort = 636; // LDAPS port
Custom Organizational Unit
var request = new CreateUserRequest
{
Username = "newuser",
Password = "P@ssw0rd",
OrganizationalUnit = "OU=Developers,OU=Users,DC=example,DC=com"
};
Partial Updates
var updateRequest = new UpdateUserRequest
{
Email = "newemail@example.com",
// Only email will be updated, other fields remain unchanged
};
await _adClient.UpdateUserAsync("username", updateRequest);
Requirements
- .NET 9.0 or later
- Access to an Active Directory server
- LDAP credentials with appropriate permissions
Dependencies
- Novell.Directory.Ldap.NETStandard 4.0.0 (GitHub, MIT License)
- Microsoft.Extensions.DependencyInjection.Abstractions 9.0.0
- Microsoft.Extensions.Options 9.0.0
- Microsoft.Extensions.Configuration.Abstractions 9.0.0
- Microsoft.Extensions.Configuration.Binder 9.0.0
- Microsoft.Extensions.Options.ConfigurationExtensions 9.0.0
See CHANGELOG.md for release notes.