• Joined on 2024-04-24

ActiveDirectoryClient (0.2.0)

Published 2025-10-07 17:34:06 +02:00 by Jannes

Installation

dotnet nuget add source --name Jannes --username your_username --password your_token 
dotnet add package --source Jannes --version 0.2.0 ActiveDirectoryClient

About 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: IActiveDirectoryClient interface for dependency injection
  • Mock Implementation: Built-in MockActiveDirectoryClient for 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 address
  • GetAllUsersAsync() - Retrieve all users from AD
  • UserExistsAsync(string username) - Check if a user exists

User Management

  • CreateUserAsync(CreateUserRequest request) - Create a new AD user
  • UpdateUserAsync(string username, UpdateUserRequest request) - Update an existing user
  • DeleteUserAsync(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 - sAMAccountName
  • DistinguishedName - Full DN
  • MemberOf - Group memberships
  • Email - Email address
  • FirstName - Given name
  • LastName - Surname
  • DisplayName - Display name
  • UserPrincipalName - UPN
  • IsEnabled - Account status
  • OrganizationalUnit - OU path
  • TelephoneNumber - Phone number
  • Title - Job title
  • Department - 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: IActiveDirectoryClient interface
  • Implementations:
    • LdapActiveDirectoryClient - Production LDAP implementation
    • MockActiveDirectoryClient - In-memory mock for testing
  • Models: DTOs for users and requests
  • Configuration: ActiveDirectoryOptions for 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.

Dependencies

ID Version Target Framework
Microsoft.Extensions.Configuration.Abstractions 9.0.0 net9.0
Microsoft.Extensions.Configuration.Binder 9.0.0 net9.0
Microsoft.Extensions.DependencyInjection.Abstractions 9.0.0 net9.0
Microsoft.Extensions.Options 9.0.0 net9.0
Microsoft.Extensions.Options.ConfigurationExtensions 9.0.0 net9.0
Novell.Directory.Ldap.NETStandard 3.6.0 net9.0
System.DirectoryServices.Protocols 9.0.0 net9.0
Details
NuGet
2025-10-07 17:34:06 +02:00
0
SGNW GbR
70 KiB
Assets (4)
Versions (3) View all
0.2.0 2025-10-07
0.1.1 2025-10-01
1.0.0-dev.665171c8 2025-10-01