Authentification unique (OIDC)
Mugnsoft prend en charge l’authentification unique (SSO) basee sur des standards via OpenID Connect (OIDC), en complement de l’authentification locale par mot de passe et de LDAP. Tout fournisseur d’identite conforme fonctionne — Microsoft Entra ID, Okta, Auth0, Keycloak, Google Workspace — en utilisant uniquement l’OIDC standard, sans API specifique au fournisseur.
Vue d’ensemble
OIDC est une troisieme methode d’authentification optionnelle. Elle coexiste avec la connexion locale et LDAP — l’activer ne desactive pas les autres (sauf si vous choisissez le mode SSO uniquement). Lorsqu’elle est activee, la page de connexion affiche un bouton Se connecter avec {fournisseur}.
Comportements cles :
- Flux de code d’autorisation avec PKCE (S256) — le flux navigateur moderne et securise.
- Provisionnement a la volee (JIT) — lors de la premiere connexion SSO d’un utilisateur sur le plan de controle, un compte Mugnsoft est cree automatiquement a partir des revendications du jeton d’identite. Aucune creation prealable necessaire. (Un frontal DMZ en lecture seule ne provisionne pas — voir SSO sur un frontal DMZ en lecture seule.)
- Mappage des roles a chaque connexion — les groupes du fournisseur sont traduits en
group+type de compteMugnsoft et resynchronises a chaque connexion, l’acces suit donc le fournisseur. - Garde anti-detournement — une connexion SSO ne peut jamais reprendre silencieusement un compte local ou LDAP existant portant le meme nom d’utilisateur.
- Mode SSO uniquement — masque optionnellement le formulaire nom d’utilisateur/mot de passe pour que les utilisateurs s’authentifient exclusivement via le fournisseur (avec une issue de secours integree).
- Deconnexion unique (Single Logout) — termine optionnellement aussi la session du fournisseur lors de la deconnexion, afin que la prochaine connexion redemande les identifiants.
Voir Gestion des utilisateurs SSO pour le cycle de vie au quotidien (colonne Auth, desactivation vs suppression).
Architecture
Le jeton d’identite est verifie par la bibliotheque go-oidc par rapport au JWKS du fournisseur (signature, emetteur, audience, expiration). Mugnsoft ne stocke dans le navigateur que son propre cookie de session a duree de vie courte — jamais les jetons d’acces ou d’identite du fournisseur. Le secret client est stocke chiffre dans le magasin de configuration KV et n’est jamais journalise ni renvoye au navigateur.
Le compte provisionne est un utilisateur Mugnsoft standard avec type d'auth = oidc. Les utilisateurs OIDC n’ont pas de mot de passe local et ne peuvent pas utiliser le formulaire de mot de passe.
Configuration
Connectez-vous en tant qu'administrateur et allez dans Parametres → Services externes → AUTHENTICATION → SSO (OIDC).
| Champ | Signification |
|---|---|
| Activer (interrupteur) | Activation/desactivation globale d’OIDC. |
| SSO uniquement (masquer la connexion locale) | Masque le formulaire nom d’utilisateur/mot de passe sur la page de connexion (bouton uniquement). Voir Mode SSO uniquement. |
| Deconnexion unique (interrupteur, par defaut active) | Termine la session du fournisseur a la deconnexion via une deconnexion initiee par l’application. Desactive = deconnexion locale uniquement (la session du fournisseur reste, la reconnexion peut donc etre silencieuse). Voir Deconnexion. |
| Nom du fournisseur | Libelle affiche sur le bouton de connexion (ex. Okta). |
| URL de l’emetteur | L’emetteur du fournisseur, ex. https://login.microsoftonline.com/<tenant>/v2.0. Mugnsoft ajoute /.well-known/openid-configuration pour la decouverte. |
| ID client | L’identifiant de l’application/client enregistre aupres du fournisseur. |
| Secret client | Le secret du client confidentiel. Stocke chiffre ; affiche •••••• a la reouverture — laissez vide pour conserver la valeur stockee. |
| URL de redirection | Doit correspondre exactement a l’URI de redirection enregistre aupres du fournisseur : https://<hote-mugnsoft>/auth/oidc/callback. |
| Redirection apres deconnexion | Ou le fournisseur renvoie le navigateur apres une deconnexion initiee par l’application. |
| Scopes | Scopes demandes, par defaut openid, profile, email. |
| Revendication nom d’utilisateur | Revendication du jeton d’identite utilisee comme nom d’utilisateur Mugnsoft, par defaut preferred_username (repli sur email, puis sub). Un nom d’utilisateur n’est tire de la revendication email que si le fournisseur la marque verifiee (email_verified=true) ; sinon le repli continue vers sub. Les noms d’utilisateur sont mis en minuscules et detoures, ainsi Alice et alice designent le meme compte. |
| Revendication groupes | Revendication contenant les groupes de l’utilisateur, par defaut groups. Lue d’abord dans le jeton d’identite, puis dans l’endpoint UserInfo en repli — un mappeur du fournisseur qui n’ajoute les groupes qu’au UserInfo fonctionne donc quand meme. |
| Groupe par defaut | Groupe Mugnsoft lorsqu’aucune entree de mappage ne correspond, par defaut viewer. |
| Type de compte par defaut | Type de compte lorsqu’aucun mappage ne correspond, par defaut full. |
| Mappage des roles (JSON) | Associe les noms de groupes du fournisseur a un group + accountType Mugnsoft. |
Cliquez sur l’icone de test (eclair) a cote de l’URL de l’emetteur — ou l’icone eclair sur la tuile SSO — pour verifier la decouverte aupres du fournisseur. Les parametres SSO sont enregistres en meme temps que le reste des parametres du serveur web a l’aide du bouton enregistrer (disquette) principal en haut de la fenetre ; il n’y a pas de bouton d’enregistrement SSO separe. La configuration prend effet immediatement — aucun redemarrage.
Note :
https://. Pointer une redirection http:// vers le port HTTPS provoque l’abandon du callback par le navigateur avec une erreur de reponse vide.
Mappage des roles
Le mappage des roles traduit un groupe du fournisseur vers le modele d’autorisation Mugnsoft (group parmi admin/user/viewer, plus un accountType et un perimetre optionnel). Il est reapplique a chaque connexion.
{
"Mugnsoft_Admins": { "group": "admin", "accountType": "full" },
"Mugnsoft_NetTeam": { "group": "user", "tags": "network,core", "apps": "vpn,dns" },
"Mugnsoft_Viewers": { "group": "viewer", "tags": "public" }
}
Lorsqu’un utilisateur appartient a plusieurs groupes mappes, le privilege le plus eleve l’emporte (admin > user > viewer). Si aucun groupe ne correspond, le Groupe par defaut / Type de compte par defaut s’appliquent.
Perimetre (tags / apps)
Chaque entree de mappage peut porter des champs optionnels tags et apps (separes par des virgules) qui restreignent ce que l’utilisateur voit — les memes champs de perimetre qu’un utilisateur local. Le perimetre effectif est l'union sur tous les groupes auxquels l’utilisateur correspond, et il s’applique a tous les groupes, y compris admin (un admin peut aussi etre restreint). Les deux sont resynchronises depuis le mappage a chaque connexion.
Une dimension que vous omettez n’est pas effacee — si une entree n’a pas de tags, l’utilisateur conserve les tags deja presents sur son enregistrement (definis manuellement, ou repris d’une connexion precedente). Pour accorder une visibilite totale, ne definissez simplement aucun perimetre pour ce groupe. Sur un frontal DMZ en lecture seule, le perimetre est calcule en direct depuis les groupes de la connexion, avec repli sur l’enregistrement replique quand le mappage n’en definit aucun.
Note :
group cible doit etre admin, user ou viewer. Enregistrer un mappage (ou un Groupe par defaut) ciblant toute autre valeur est rejete avec un message groupe invalide — cela evite qu’une faute de frappe soit ecrite sur les enregistrements utilisateur et casse silencieusement l’autorisation. Le accountType est libre (par defaut full).
Note :
/Mugnsoft_Admins) correspond toujours a une cle de mappage Mugnsoft_Admins. Vous n’avez pas besoin de reproduire la barre oblique ou la casse du fournisseur. Le nom lui-meme doit neanmoins correspondre : certains fournisseurs envoient des identifiants d’objet opaques au lieu des noms (voir la configuration de chaque fournisseur ci-dessous).
Mode SSO uniquement
Avec SSO uniquement active, la carte de connexion masque le formulaire nom d’utilisateur/mot de passe et n’affiche que le bouton SSO — la page reste par ailleurs identique. Pour eviter tout verrouillage, deux issues de secours restaurent toujours le formulaire local :
- Ajoutez
?local=1a l’URL de connexion. - Toute tentative SSO echouee renvoie a la page de connexion avec le formulaire local visible.
Note :
Gestion des utilisateurs SSO
Les comptes SSO apparaissent dans Parametres → Utilisateurs aux cotes des utilisateurs locaux et LDAP. Le tableau des utilisateurs comporte une colonne Auth indiquant la source de chaque utilisateur — SSO, LDAP ou Local — afin de voir d’un coup d’oeil comment chacun se connecte.
Desactiver vs supprimer un utilisateur SSO
Comme les comptes SSO sont provisionnes a la volee, les deux actions se comportent differemment :
| Action | Effet sur un utilisateur SSO |
|---|---|
| Desactiver (basculer l’etat sur desactive) | Bloque la connexion. La prochaine tentative SSO est refusee avec ?ssoerror=userdisabled et le compte reste desactive. C’est la bonne facon de bloquer un utilisateur SSO tout en gardant le SSO active. |
| Supprimer | Retire l’enregistrement local, mais il est recree automatiquement a la prochaine connexion de la personne via le fournisseur (tant qu’elle existe et est activee chez le fournisseur). La suppression n’est donc pas un blocage durable. |
Pour retirer quelqu’un definitivement, desactivez-le ou supprimez-le chez le fournisseur d’identite (ou desactivez-le dans Mugnsoft). Le groupe et le type de compte sont resynchronises depuis le fournisseur a chaque connexion ; modifier directement le groupe d’un utilisateur dans Mugnsoft est donc ecrase a la connexion suivante — modifiez plutot le mappage ou le groupe cote fournisseur.
Note :
SSO sur un frontal DMZ en lecture seule
Un frontal Mugnsoft deploye en DMZ est une replique en lecture seule alimentee par une replication a sens unique depuis le plan de controle. Le SSO y fonctionne, mais le provisionnement a la volee est desactive : le frontal ne cree ni ne modifie jamais d’enregistrement utilisateur. Il n’admet que les utilisateurs SSO deja presents dans le magasin d’utilisateurs replique (et reapplique leur role d’apres les groupes de la connexion en cours).
Consequence pratique : un nouvel utilisateur SSO doit d’abord se connecter sur le plan de controle (ce qui le provisionne et permet a la replication de porter l’enregistrement vers la DMZ). Se connecter sur la DMZ avant que le compte ne soit replique est refuse avec ?ssoerror=provision.
Le frontal s’authentifie en client public PKCE (aucun secret en DMZ)
Vous ne configurez pas OIDC sur le frontal. Le plan de controle conserve la configuration confidentielle (emetteur, client ID, secret client, mappage de roles) et ne replique jamais le secret — le bucket setting reste interne. A la place, quand vous enregistrez les parametres OIDC, le plan de controle publie une config publique sans secret que la replication porte automatiquement vers le frontal.
Comme un secret client ne doit jamais se trouver sur un hote DMZ expose, le frontal se connecte en client public OAuth via Code d’autorisation + PKCE — sans secret. Le code_verifier PKCE protege l’echange ; l’IdP n’a besoin que de l’ID du client public et de l’URI de redirection propre au frontal.
Pour l’activer :
- Chez votre IdP, enregistrez un second client pour le frontal en client public (PKCE requis, sans secret), avec l’URI de redirection
https://<hote-frontal>/auth/oidc/callback. Voir la note client public sous chaque fournisseur. - Dans Mugnsoft → Parametres → SSO (OIDC), renseignez :
- Front client ID (public) — l’ID du client public. (Laissez vide seulement si votre client principal est lui-meme public/compatible PKCE.)
- Front redirect URL —
https://<hote-frontal>/auth/oidc/callback.
- Enregistrez. La config publique est repliquee vers le frontal selon la cadence de replication habituelle (et le bouton Se connecter avec SSO y apparait des qu’elle arrive).
Pourquoi un client public separe
Configuration des fournisseurs
Les valeurs a enregistrer chez chaque fournisseur sont identiques :
- URI de redirection :
https://<hote-mugnsoft>/auth/oidc/callback - Flux : Code d’autorisation (+ PKCE)
- Scopes :
openid profile email(plus une revendication/un scope de groupes)
Optionnel : un client public pour le frontal DMZ
Si vous exploitez un frontal DMZ en lecture seule, enregistrez un second client public (sans secret) en plus du client confidentiel ci-dessus :
- Type de client : public — PKCE requis, aucun secret.
- URI de redirection :
https://<hote-frontal>/auth/oidc/callback. - Memes scopes et revendication de groupes que le client principal.
Indices fournisseurs : Entra ID — une inscription sans secret avec redirection SPA/public ; Okta — Application type → Single-Page Application (PKCE, sans secret) ; Auth0 — Application type → Single-Page Application (PKCE, sans secret) ; Keycloak — un client avec Client authentication OFF (public) et Standard flow ON ; Google — non applicable. Reportez l’ID de ce client dans Front client ID (public) dans Mugnsoft.
Microsoft Entra ID
- Centre d’administration Entra → Inscriptions d’applications → Nouvelle inscription.
- URI de redirection (Web) :
https://<hote-mugnsoft>/auth/oidc/callback.
- URI de redirection (Web) :
- Certificats et secrets → Nouveau secret client → copiez la valeur.
- Configuration des jetons → Ajouter une revendication de groupes → selectionnez Groupes de securite (ou les groupes affectes a l’application). Ajoutez-la au jeton d’identite.
- Notez l'ID d’application (client) et l'ID de l’annuaire (tenant).
- Dans Mugnsoft :
- URL de l’emetteur :
https://login.microsoftonline.com/<tenant-id>/v2.0 - ID client / Secret : des etapes 1 a 2.
- Revendication groupes :
groups.
- URL de l’emetteur :
Note :
"a1b2c3d4-...": { "group": "admin", "accountType": "full" }. Pour utiliser les noms a la place, configurez l’emission des noms de groupes (revendications optionnelles) pour les groupes synchronises.
Okta
- Admin Okta → Applications → Create App Integration → OIDC → Web Application.
- Sign-in redirect URI :
https://<hote-mugnsoft>/auth/oidc/callback. Sign-out redirect URI : votre URL de redirection apres deconnexion. - Copiez le Client ID et le Client secret.
- Ajoutez une revendication groupes : Security → API → Authorization Servers → default → Claims → Add claim :
- Nom :
groups, Include in : ID token, Value type : Groups, Filtre :Matches regex .*(ou un filtre plus strict).
- Nom :
- Dans Mugnsoft :
- URL de l’emetteur :
https://<votre-org>.okta.com/oauth2/default(ou l’emetteur de votre serveur d’autorisation personnalise). - ID client / Secret de l’etape 3.
- Revendication groupes :
groups.
- URL de l’emetteur :
Auth0
- Tableau de bord Auth0 → Applications → Create Application → Regular Web Application (client confidentiel avec secret).
- Settings → Allowed Callback URLs :
https://<hote-mugnsoft>/auth/oidc/callback. Allowed Logout URLs : votre URL de redirection apres deconnexion. - Copiez le Domain, le Client ID et le Client Secret.
- Auth0 n’emet pas les groupes ou roles dans le jeton d’identite par defaut, et Auth0 rejette toute revendication personnalisee qui n’est pas une URI avec espace de noms. Ajoutez une Action post-connexion (Actions → Library → Build Custom, ajoutee au flux Login) qui injecte les roles/groupes de l’utilisateur comme revendication avec espace de noms :
exports.onExecutePostLogin = async (event, api) => {
const ns = "https://mugnsoft/";
const roles = event.authorization?.roles || []; // necessite RBAC active
api.idToken.setCustomClaim(ns + "groups", roles);
};
- Dans Mugnsoft :
- URL de l’emetteur :
https://<tenant>.<region>.auth0.com/— conservez la barre oblique finale ; elle doit correspondre a la valeurissqu’Auth0 place dans le jeton. - ID client / Secret de l’etape 3.
- Revendication groupes :
https://mugnsoft/groups— le nom complet avec espace de noms issu de l’Action, pas un simplegroups.
- URL de l’emetteur :
Note :
groups simple n’atteint jamais Mugnsoft. Definissez Revendication groupes avec le nom exact (espace de noms compris) utilise dans l’Action (par ex. https://mugnsoft/groups), et utilisez event.authorization.roles (RBAC) ou event.user.app_metadata comme source.
Keycloak
Un guide local complet (Docker, realm, client, mappeur de groupes, utilisateur de test) figure dans le tutoriel du depot. En resume :
- Creez un realm ; l’emetteur devient
http://<hote>:8080/realms/<realm>. - Creez un client OpenID Connect, Client authentication ON (confidentiel), Standard flow ON. URI de redirection
https://<hote-mugnsoft>/auth/oidc/callback. - Copiez le secret depuis l’onglet Credentials.
- Ajoutez un mappeur Group Membership sur le scope dedie du client (
<client>-dedicated), pas un scope client Optional. Token Claim Name doit valoirgroups— Keycloak emet la revendication sous Token Claim Name, pas sous le Name du mappeur ; laisser ce champ vide ne produit aucune revendicationgroups, meme avec tous les interrupteurs sur ON. Activez Add to ID token et/ou Add to userinfo (au moins un). Full group path peut etre active ou non — Mugnsoft ignore la barre oblique de tete dans les deux cas. Un mappeur sur le scope dedie est toujours emis ; un mappeur sur un scope Optional n’est envoye que si le client demande ce scope par son nom. - Dans Mugnsoft, definissez l’URL de l’emetteur, l’ID client
=client, le secret, la revendication groupesgroups.
Google Workspace
Google emet des jetons d’identite avec email, name et sub, mais n’inclut pas l’appartenance aux groupes dans le jeton d’identite standard. La connexion de base fonctionne immediatement ; pour le mappage de roles base sur les groupes, vous devez exposer les groupes separement (Cloud Identity / une synchronisation d’annuaire), sinon tous les utilisateurs basculent sur le Groupe par defaut.
- Console Google Cloud → API et services → Identifiants → Creer un ID client OAuth → Application Web.
- URI de redirection autorise :
https://<hote-mugnsoft>/auth/oidc/callback. - Utilisez l’URL de l’emetteur
https://accounts.google.com, revendication nom d’utilisateuremail. Google positionneemail_verified=truepour les comptes Workspace geres, ce que Mugnsoft exige avant d’accepter un email comme nom d’utilisateur.
Deconnexion
La deconnexion efface toujours la session Mugnsoft. Ce qui arrive a la session du fournisseur depend du parametre Deconnexion unique :
- Deconnexion unique activee (par defaut) — lorsque le document de decouverte du fournisseur expose un
end_session_endpoint, Mugnsoft effectue une deconnexion initiee par l’application : le navigateur est redirige vers le fournisseur pour terminer sa session, puis revient vers la Redirection apres deconnexion. La connexion suivante redemande les identifiants. La deconnexion est transparente — aucun ecran de confirmation « voulez-vous vous deconnecter ? » du fournisseur. - Deconnexion unique desactivee — seule la session Mugnsoft locale est effacee. La session du fournisseur est conservee ; recliquer sur Se connecter avec {fournisseur} peut donc reconnecter l’utilisateur sans invite.
Cela fonctionne avec tout fournisseur annoncant un end_session_endpoint (Entra ID, Okta, Keycloak, Auth0). Google Workspace n’en fournit pas, la deconnexion reste donc toujours locale quel que soit le reglage.
Depannage
Les tentatives SSO echouees renvoient a la page de connexion avec un parametre ?ssoerror=<code>. Codes :
| Code | Signification / correction |
|---|---|
disabled |
OIDC non active, ou l’initialisation du fournisseur a echoue. Verifiez l’URL de l’emetteur, que le fournisseur est joignable depuis l’hote Mugnsoft, et les journaux serveur autour de initOIDCProvider. |
userdisabled |
Le fournisseur a authentifie l’utilisateur, mais son compte Mugnsoft est desactive. Reactivez-le dans Parametres → Utilisateurs, ou retirez la desactivation. |
unreachable |
Le fournisseur d’identite est injoignable depuis l’hote Mugnsoft (DNS, pare-feu, fournisseur arrete, ou echec TLS). Le bouton Se connecter avec {fournisseur} verifie le fournisseur au prealable et signale ceci au lieu de vous laisser sur la page d’erreur de connexion du navigateur. Verifiez le reseau/le fournisseur et les journaux serveur autour de oidcLogin. |
idp |
Le fournisseur a renvoye une erreur au callback (consentement refuse, client mal configure). Verifiez les journaux de l’application cote fournisseur. |
state |
Le cookie oidc_state etait manquant ou ne correspondait pas (callback perime, blocage de cookies inter-sites). Recommencez depuis le bouton de connexion. |
expired |
Le jeton d’identite avait expire — generalement un decalage d’horloge. Verifiez que l’horloge de l’hote est correcte (NTP). |
exchange |
L’echange du code d’autorisation a echoue (mauvais secret, mauvais URI de redirection, non-correspondance PKCE). Verifiez le secret client et que l’URI de redirection enregistre correspond exactement. |
token |
La verification du jeton d’identite a echoue (non-correspondance de signature, emetteur ou audience). Verifiez que l’ID client correspond a l’audience du jeton et que l’URL de l’emetteur est exacte. |
nonce |
Non-correspondance du nonce — un callback rejoue ou perime. Recommencez. |
claims |
Les revendications du jeton d’identite n’ont pas pu etre analysees. |
username |
Aucun nom d’utilisateur utilisable n’a pu etre resolu. Soit la revendication nom d’utilisateur configuree etait absente, soit elle ne resolvait qu’un email non verifie (Mugnsoft refuse un email non verifie comme nom d’utilisateur). Verifiez que la revendication est emise (par defaut preferred_username) ou que le fournisseur envoie email_verified=true. |
provision |
Le provisionnement de l’utilisateur a ete refuse — generalement le nom d’utilisateur entre en conflit avec un compte local/LDAP existant (garde anti-detournement), ou, sur un frontal DMZ en lecture seule, l’utilisateur n’a pas encore ete replique (voir la note plus haut). Utilisez un nom d’utilisateur distinct. |
session |
Le jeton de session de l’application n’a pas pu etre genere. Verifiez les journaux serveur. |
internal |
Erreur serveur inattendue. Verifiez les journaux serveur. |
Problemes courants sans code d’erreur :
- Groupe/role non applique — le fournisseur n’emet pas du tout la revendication groupes (aucun mappage de groupe/role configure, ou il est rattache a un scope que le client ne demande pas), le nom de la revendication ne correspond pas a la Revendication groupes configuree, ou les cles de groupe du mappage de roles ne correspondent pas a ce que le fournisseur envoie (chemin complet ou identifiant opaque au lieu du nom). Mugnsoft lit les groupes d’abord dans le jeton d’identite puis bascule sur l’endpoint UserInfo : emettre la revendication sur l’un ou l’autre suffit — mais si aucun ne la porte, chaque utilisateur recoit le Groupe par defaut. Quand aucun groupe n’arrive, le serveur ecrit une ligne
WARNlistant les revendications reellement envoyees par le fournisseur —oidcCallback - <user>: groups claim "groups" absent. ID-token claims=[...] UserInfo claims=[...]— pour voir si la revendication manque totalement ou existe sous un autre nom (definissez Revendication groupes sur ce nom). En cas de succes, le log afficheoidcCallback - <user> groups=[...]. Voir la section de configuration de votre fournisseur pour savoir ou ajouter la revendication de groupe. - Echec du test de decouverte — mauvais emetteur (barre oblique finale, mauvais realm/tenant) ou fournisseur injoignable depuis l’hote serveur. Ouvrez l’URL
.well-known/openid-configurationdepuis l’hote pour confirmer. - Le callback s’interrompt avec une reponse vide — le schema de l’URL de redirection ne correspond pas au serveur. Sur un serveur HTTPS, utilisez une redirection
https://dans Mugnsoft et chez le fournisseur. - Un utilisateur SSO supprime revient sans cesse — c’est attendu (re-provisionnement a la volee). Desactivez-le dans Mugnsoft, ou retirez-le chez le fournisseur. Voir Gestion des utilisateurs SSO.
Notes de securite
- Les jetons d’identite sont verifies pour la signature, l’emetteur, l’audience et l’expiration par rapport au JWKS du fournisseur ; les jetons non signes ne sont jamais approuves.
- La validation du state + nonce et le PKCE (S256) protegent contre le CSRF et l’interception du code.
- La verification TLS est toujours active.
- Le secret client est stocke chiffre et n’est jamais ecrit dans les journaux ni renvoye au navigateur.
- Seul le cookie de session Mugnsoft (HTTPOnly, SameSite=Lax, Secure en HTTPS) est place dans le navigateur — aucun jeton du fournisseur.
- Un nom d’utilisateur n’est jamais tire d’une revendication email non verifiee, et les noms d’utilisateur sont normalises (minuscules, detoures) afin que les variantes de casse ne creent pas de comptes en double.
- Les cibles du mappage de roles sont validees a
admin/user/viewera l’enregistrement ; un groupe invalide ne peut jamais etre ecrit sur un enregistrement utilisateur. - Un frontal DMZ en lecture seule n’effectue aucune ecriture utilisateur lors de la connexion SSO — il ne peut ni creer, ni modifier, ni reactiver de comptes.