ADSelfService est une solution intranet open source pour Active Directory.
Le dépôt regroupe une API .NET 8 et un client web PHP pensés pour fonctionner ensemble, avec une séparation claire entre logique AD, sécurité d'accès et interface intranet.
Les deux composants principaux sont :
ADSelfService-API.Server: API .NET 8 pour l'authentification, les opérations LDAP/AD et les contrôles de sécurité serveur.WEB-CLIENT-PHP: portail intranet PHP pour les parcours utilisateur, l'administration, l'i18n et les flux web.
ADSelfService-API/
|- ADSelfService-API.Server/ API .NET 8
|- WEB-CLIENT-PHP/ client intranet PHP
|- CONFIG-OPTIONS.md référence config API (FR)
|- CONFIG-OPTIONS.en.md référence config API (EN)
|- README.md vue d'ensemble FR
`- README.en.md vue d'ensemble EN
- Authentification AD (
POST /auth). - Consultation et mise à jour du profil utilisateur.
- Changement de mot de passe utilisateur.
- Réinitialisation de mot de passe via un flux dédié.
- Administration des comptes AD : création, modification, suppression, activation, désactivation, déblocage, renommage, déplacement, expiration.
- Administration des groupes et des membres.
- Administration des OU (création, mise à jour, suppression).
- Explorateur AD et recherche d'objets.
- Accès aux outils filtré selon les droits utilisateur.
ADSelfService est particulièrement adapté pour :
- homelabs et environnements de test
- petites et moyennes structures
- équipes IT qui veulent une base simple, lisible et auto-hébergeable
Le projet peut aussi être utilisé en production, à condition d'appliquer un durcissement standard :
- TLS correct entre client web et API
- LDAP protégé (
LDAPSouKerberos sealing) - secret interne robuste (
InternalSharedSecret) - filtrage IP strict (
AllowedIps) - compte de service AD à privilèges minimaux
- sauvegardes, supervision et plan de mise à jour
Le comportement actuel du code impose :
- filtrage des appels via
Security.AllowedIps - clé partagée interne obligatoire et robuste :
Security.InternalSharedSecret - en-tête de contexte applicatif requis sur les routes sensibles :
X-App-Context - transport LDAP protégé obligatoire :
Ldap.Ssl=true(LDAPS), ouLdap.UseKerberosSealing=true(LDAP + Kerberos sealing)
Debug.ShowPasswords=trueinterdit
Si ces contraintes ne sont pas respectées, l'API peut refuser de démarrer ou rejeter les appels.
- Utilisateur standard : profil, mot de passe, outils autorisés.
- Admin utilisateurs : gestion des comptes et appartenances.
- Admin domaine : actions avancées (OU, groupes, explorateur AD).
Le client PHP filtre l'interface selon le rôle, et l'API applique aussi les contrôles côté serveur.
- Télécharger les archives depuis GitHub Releases.
- Déployer
ADSelfService-API-Server.zipsur l'hôte API. - Lancer
ADSelfService-API.Server.exeune première fois pour générerconfig.json. - Compléter
config.json(LDAP, sécurité, écoute serveur). - Redémarrer l'API puis vérifier
GET /health. - Déployer
ADSelfService-WEBSERVER-Files.zipsur l'hôte web. - Créer
WEB-CLIENT-PHP/config-intranet.phpdepuisconfig-intranet-default.php. - Vérifier la cohérence entre
API_BASEetINTERNAL_SHARED_SECRET.
git clone <url-du-repo>
cd ADSelfService-API
copy config.example.json config.json
cd ADSelfService-API.Server
dotnet run- ADSelfService-API.Server/README.md
- CONFIG-OPTIONS.md
- ADSelfService-API.Server/LDAP-CONFIG.md
- ADSelfService-API.Server/ENDPOINTS.md
- ADSelfService-API.Server/CHANGELOG.md
- WEB-CLIENT-PHP/README.md
WEB-CLIENT-PHP/config-intranet-default.phpWEB-CLIENT-PHP/intranet-i18n.phpWEB-CLIENT-PHP/forgot_password.php
GET /healthretourne200.- Connexion utilisateur fonctionnelle.
- Changement de mot de passe fonctionnel.
- Réinitialisation de mot de passe fonctionnelle.
- Outils correctement filtrés selon les droits.
- Actions admin visibles et effectives selon le rôle.
- Recherches AD cohérentes avec
BaseDn,GroupBaseDnetRootDn.
| Problème | Vérification prioritaire |
|---|---|
403 sur les appels API |
AllowedIps, InternalSharedSecret, X-App-Context |
| API ne démarre pas | config.json invalide/incomplet, contrainte sécurité non respectée |
| Échec LDAP bind | Ldap.Url, Port, BindDn, BindPassword, DNS/réseau |
| Changement de mot de passe refusé | vérifier LDAPS ou Kerberos sealing |
| Client PHP bloqué | config-intranet.php, API_BASE, secret partagé |