SSO sous Immersive
- Type non défini
Configuration
Cette documentation décrit la configuration du SSO de RestFrontage, le rattachement des comptes Immersive et les parcours SAML 2.0 et OpenID. Elle s’adresse aux administrateurs Immersive, aux responsables de fédération d’identités et aux intégrateurs des applications clientes.
Les adresses, identifiants et comptes des exemples sont fictifs.
Dans cet article
1. Comprendre le SSO dans Immersive
Le Single Sign-On, ou SSO, permet à un utilisateur de s’authentifier auprès d’un fournisseur d’identité externe, puis d’accéder à une application Immersive. Le fournisseur d’identité, appelé IdP, gère la connexion et peut appliquer ses propres exigences, par exemple une authentification multifacteur.
RestFrontage retrouve ensuite un compte Immersive à partir de l’identité externe, vérifie l’état de ce compte et émet un jeton d’authentification Immersive. Les droits utilisés par l’application restent ceux du compte, de ses groupes et de ses habilitations dans Immersive.
1.1 Les trois éléments à distinguer
| Élément | Rôle |
|---|---|
| Identité externe | Identifie la personne auprès de l’IdP. Elle doit pouvoir être rapprochée d’un compte Immersive. |
| Compte Immersive | Porte l’état du compte et ses droits sur les objets et les fonctions de la plateforme. |
| Jeton Immersive | Est retourné par RestFrontage après l’authentification et sert aux échanges suivants avec l’API. Sa durée dépend de la configuration de l’application. |
Le jeton d’accès de l’IdP, la réponse SAML et le jeton Immersive sont des éléments différents. Une authentification réussie chez l’IdP ne suffit pas à accorder des droits dans Immersive.
flowchart TD
A["Authentification auprès du fournisseur d’identité"] --> B["Identité externe"]
B --> C{"Compte Immersive correspondant ?"}
C -->|"Non"| X["Connexion refusée"]
C -->|"Oui"| D{"Compte activé, non expiré et non verrouillé ?"}
D -->|"Non"| X
D -->|"Oui"| E["Émission d’un jeton Immersive"]
E --> F["Accès selon les droits du compte et de ses groupes"]
1.2 Les deux parcours disponibles
RestFrontage propose deux parcours d’authentification externe : SAML et OpenID. Ils permettent tous deux de retrouver un compte Immersive existant, de vérifier son état et de délivrer un jeton Immersive. Les droits restent ceux du compte et de ses groupes.
Ces parcours diffèrent par la manière dont le client et RestFrontage échangent avec le fournisseur d’identité :
| Étape de la connexion | Avec SAML | Avec OpenID |
|---|---|---|
| Démarrer l’authentification externe | Le client demande à RestFrontage une URL SAML, puis ouvre la page de connexion du fournisseur d’identité. | Le client s’authentifie auprès du fournisseur d’identité pour obtenir un jeton d’accès externe. |
| Transmettre le résultat à RestFrontage | Le navigateur transmet une réponse SAML XML à RestFrontage. | Le client transmet le jeton d’accès externe à RestFrontage. |
| Identifier le compte externe | RestFrontage lit l’attribut de compte dans la réponse SAML. | RestFrontage appelle tokeninfo puis userinfo et lit la propriété login. |
| Terminer la connexion Immersive | Le client échange l’identifiant de demande SAML contre un jeton Immersive, après vérification du compte. | RestFrontage délivre un jeton Immersive après les appels au fournisseur d’identité et la vérification du compte. |
Lorsque le fournisseur d’identité et l’application cliente sont compatibles avec les parcours pris en charge, le raccordement s’effectue par configuration de RestFrontage, du fournisseur d’identité et du client, puis par rattachement des comptes Immersive. Aucun développement spécifique de connexion n’est alors nécessaire. Une adaptation peut toutefois être requise si les échanges attendus ou les exigences de sécurité du déploiement ne sont pas couverts par l’implémentation.
1.2.1 Correspondance avec le compte Immersive
RestFrontage utilise le nom de compte reçu du fournisseur d’identité pour rechercher un utilisateur Immersive. Cette valeur doit correspondre au champ Nom de compte de rattachement externe, appelé AssociatedExternalUserAccountName dans le modèle.
Avec SAML, la valeur provient d’un attribut de la réponse XML envoyée par le fournisseur d’identité. RestFrontage recherche d’abord l’attribut nommé cn. S’il est absent, il recherche l’attribut nommé http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name.
L’administrateur du fournisseur d’identité configure les attributs transmis pour l’application Immersive. Le nom cn désigne ici un attribut de la réponse SAML : RestFrontage ne va pas chercher cette valeur directement dans un annuaire. Le champ SAML NameID n’est pas utilisé pour retrouver le compte Immersive.
Avec OpenID, la valeur provient de la propriété login du document JSON retourné par le service userinfo du fournisseur d’identité.
Par exemple, si le compte Immersive possède agent.demo comme nom de compte de rattachement externe, l’attribut SAML retenu ou la propriété OpenID login doit contenir agent.demo.
1.2.2 Routes définies dans RestFrontage
Les chemins suivants sont définis dans l’application. Ils sont relatifs à l’adresse de base sous laquelle RestFrontage est publié.
| Fonction | Méthode et chemin relatif |
|---|---|
| Obtenir l’URL de connexion SAML | GET /api/Saml/GetSamlUrl |
| Recevoir la réponse de connexion SAML | POST /api/Saml/Login |
| Obtenir le jeton Immersive après le retour SAML | POST /api/Saml/Authenticate |
| Obtenir l’URL de déconnexion SAML | GET /api/Saml/GetSamlLogoutUrl |
| Recevoir le retour de déconnexion SAML | GET ou POST /api/Saml/Logout |
| Vérifier le jeton externe auprès des services OpenID | GET /api/OpenID/CheckToken |
| Obtenir le jeton Immersive à partir du jeton externe | POST /api/OpenID/Authenticate |
Ces routes sont présentées à titre de référence technique, notamment pour comprendre les échanges et faciliter le diagnostic. Avec un player Immersive prenant en charge le mode SSO configuré, leur utilisation est gérée par le parcours de connexion : le player déclenche les demandes nécessaires, le navigateur transmet les réponses du fournisseur d’identité et RestFrontage réalise les traitements serveur. L’administrateur n’a pas à appeler ces routes manuellement.
Le contrôleur OpenID ne définit pas de route pour ouvrir la connexion chez le fournisseur d’identité ni pour effectuer une déconnexion fédérée. Ces opérations dépendent de l’intégration du client avec le fournisseur d’identité.
Le retour de déconnexion SAML ne révoque pas explicitement les jetons Immersive dans la méthode examinée. La fermeture de la session chez le fournisseur d’identité et la fin des accès Immersive sont donc à vérifier séparément.
1.2.3 Sections de configuration du serveur
Saml et OpenID sont des sections de la configuration de l’application RestFrontage, placées à la racine du fichier de configuration du Rest Frontage appsettings.json. Leurs valeurs peuvent aussi être fournies par les variables d’environnement de l’hébergement.

- La section Saml contient les adresses du fournisseur d’identité, l’identifiant du service Immersive et les URL publiques de retour vers RestFrontage.
- La section OpenID contient notamment l’adresse de base des services tokeninfo et userinfo et l’identifiant de l’application attendu par RestFrontage.
Les paramètres SAML LoginUrl et LogoutUrl indiquent les URL publiques qui conduisent aux routes /api/Saml/Login et /api/Saml/Logout. Ils ne créent pas de nouvelles routes.
Le nom de la section OpenID ne signifie pas qu’un fournisseur OpenID Connect quelconque peut être raccordé par simple saisie de son URL. Le contrôleur dépend d’un contrat précis avec tokeninfo, userinfo, client_id, access_token, realm et login. Vérifier ce contrat avant de choisir ce parcours.
1.2.4 Parcours SAML
Le fournisseur d’identité transmet une réponse SAML par le navigateur. Le client échange ensuite l’identifiant de cette connexion contre un jeton Immersive. Le schéma présente le parcours lorsque toutes les étapes réussissent.
sequenceDiagram
participant C as Client et navigateur
participant R as RestFrontage
participant I as Fournisseur d’identité
C->>R: Demander l’URL de connexion SAML
R-->>C: URL de connexion
C->>I: Ouvrir la connexion et s’authentifier
I-->>C: Réponse SAML
C->>R: Transmettre la réponse SAML
R->>R: Retrouver le compte externe et mémoriser la demande
R-->>C: Retour de connexion
C->>R: Envoyer l’identifiant de demande chiffré
R->>R: Retrouver la demande et vérifier l’état du compte
R-->>C: Jeton Immersive et utilisateur
Le retour SAML ne constitue pas encore une authentification Immersive complète. Le client doit terminer l’échange pour obtenir le jeton Immersive.
1.2.5 Parcours OpenID
Le client obtient d’abord un jeton d’accès externe. RestFrontage interroge ensuite les services du fournisseur d’identité pour retrouver le compte Immersive. Le schéma présente le parcours spécifique de cette version, lorsque toutes les étapes réussissent.
sequenceDiagram
participant C as Client Immersive
participant R as RestFrontage
participant I as Fournisseur d’identité
C->>I: S’authentifier et obtenir un jeton d’accès
I-->>C: Jeton d’accès externe
C->>R: Envoyer le jeton externe chiffré
R->>I: Appeler tokeninfo
I-->>R: client_id, access_token et realm
R->>R: Comparer client_id avec FidAppId
R->>I: Appeler userinfo avec le jeton retourné
I-->>R: Identité contenant login
R->>R: Retrouver le compte Immersive à partir de login
R->>R: Vérifier l’état du compte
R-->>C: Jeton Immersive et utilisateur
Le jeton d’accès externe sert aux échanges avec le fournisseur d’identité. Le jeton Immersive retourné sert ensuite aux accès à la plateforme, selon les droits du compte.
2. Préparer le raccordement
2.1 Informations à réunir
| Information | À obtenir auprès de |
|---|---|
| URL publique HTTPS de RestFrontage, y compris un éventuel préfixe de chemin | Équipe exploitant Immersive. |
| URL de l’application cliente et parcours de connexion attendu | Équipe exploitant Immersive. |
| Environnement cible et accès réseau autorisés | Équipes d’exploitation et réseau. |
| Identifiant externe stable de l’utilisateur pilote | Équipe identité. |
| URL et paramètres SAML, ou contrat des services OpenID | Administrateur de l’IdP. |
| Compte Immersive pilote, groupes et droits nécessaires | Administrateur Immersive. |
Pour SAML, le navigateur doit pouvoir joindre l’IdP puis transmettre la réponse à l’URL publique de RestFrontage. Pour OpenID, RestFrontage doit aussi pouvoir appeler directement les services tokeninfo et userinfo de l’IdP.
Conserver un accès d’administration opérationnel pendant la recette. Utiliser un environnement de validation et un compte pilote avant de généraliser le raccordement.
2.2 Emplacement de la configuration
Les sections Saml et OpenID sont chargées au démarrage de RestFrontage. Elles peuvent être renseignées dans les fichiers de configuration de l’environnement ou par les variables d’environnement du processus.
Les services SAML et OpenID conservent les options reçues lors de leur création. Redémarrer l’instance RestFrontage après une modification de ces options, même si le fournisseur de configuration sait recharger un fichier.
Exemples de noms de variables d’environnement :
Saml__FidUrl
Saml__FidSsoPath
Saml__FidSloPath
Saml__EntityId
Saml__LoginUrl
Saml__LogoutUrl
OpenID__FidUrl
OpenID__FidAppId
OpenID__FidAppSecret
Les doubles tirets bas séparent la section et le nom du paramètre. Utiliser le mécanisme de configuration prévu par l’hébergement pour fournir ces valeurs à l’application.
Exemple appsettings.json sur ces deux sections :
"Saml": {
"FidUrl": "???",
"EntityId": "???",
"LoginUrl": "???/api/Saml/Login",
"LogoutUrl": "???/api/Saml/Logout"
},
"OpenID": {
"FidUrl": "???",
"FidAppId": "???",
"FidAppSecret": "???"
}
Les valeurs ??? du fichier appsettings.json de référence sont des emplacements à compléter. Ce fichier ne fournit pas une configuration SSO exploitable. Il ne contient pas non plus tous les paramètres SAML pris en charge par les classes d’options.
3. Rattacher les utilisateurs externes

3.1 Configurer la fiche utilisateur

- Ouvrir la fiche du compte dans la gestion des utilisateurs de sécurité de RestFrontage.
- Repérer le bloc Interopérabilité et ouvrir Gérer l’interopérabilité.
- Renseigner Domaine de rattachement externe pour décrire le domaine d’origine du compte.
- Renseigner Nom de compte de rattachement externe avec la valeur exacte attendue de l’IdP.
- Enregistrer la fiche, puis vérifier que le compte est activé et que ses groupes et droits sont corrects.

| Champ | Propriété | Utilisation dans les parcours examinés |
|---|---|---|
| Domaine de rattachement externe | AssociatedExternalUserDomain | Champ disponible dans la fiche ; il n’est pas utilisé par les recherches de compte SAML et OpenID examinées. |
| Nom de compte de rattachement externe | AssociatedExternalUserAccountName | Clé de rapprochement utilisée pour retrouver l’utilisateur Immersive. |
Exemple de correspondance à préparer :
| Donnée | Exemple |
|---|---|
| Nom du compte Immersive | operateur.pilote |
| Domaine externe renseigné | ENTREPRISE |
| Nom de compte externe renseigné | agent.demo |
| Valeur cn reçue en SAML | agent.demo |
| Valeur login reçue en OpenID | agent.demo |
Le compte local et le compte externe peuvent porter des noms différents. En revanche, la valeur reçue de l’IdP doit correspondre au champ de rattachement externe. Reprendre exactement sa casse et ses caractères : le code n’effectue pas de normalisation commune, et la sensibilité de certaines recherches SAML dépend aussi de la base de données.
Ne pas utiliser le domaine externe pour départager deux utilisateurs ayant le même nom de compte externe : ces contrôleurs ne l’intègrent pas à leur recherche. Prévoir une correspondance unique dans le périmètre interrogé, y compris lorsque plusieurs domaines d’identité sont présents.
3.2 Conditions d’accès du compte Immersive
Le compte doit déjà exister. Aucun provisionnement automatique d’utilisateur ou de groupe à partir des attributs SAML ou OpenID n’apparaît dans ces parcours.
L’émission du jeton Immersive est refusée lorsque le compte est désactivé, expiré ou encore verrouillé. Les contrôleurs vérifient notamment IsEnabled, ExpirationDate et LockoutUntilUtc. Un compte arrivé à expiration est désactivé dans le parcours d’authentification.
Les rôles ou groupes transmis par l’IdP ne sont pas transformés automatiquement en droits Immersive par ces contrôleurs. Affecter les droits au compte ou à ses groupes dans Immersive et les vérifier après connexion.
4. Configurer SAML
4.1 Paramètres RestFrontage
| Paramètre | Rôle | Exemple fictif |
|---|---|---|
| Saml:FidUrl | Base de l’URL du fournisseur d’identité. | https://idp.example.net |
| Saml:FidSsoPath | Chemin ajouté à FidUrl pour la connexion. | /saml/sso |
| Saml:FidSloPath | Chemin ajouté à FidUrl pour la déconnexion fédérée. | /saml/slo |
| Saml:EntityId | Identifiant du service Immersive déclaré auprès de l’IdP et placé dans Issuer. | urn:example:immersive:recette |
| Saml:LoginUrl | URL publique de réception de la réponse de connexion, ou ACS. | https://rest.example.net/api/Saml/Login |
| Saml:LogoutUrl | URL publique de retour de déconnexion. | https://rest.example.net/api/Saml/Logout |
Le service construit les destinations par concaténation directe de FidUrl et du chemin. Avec l’exemple ci-dessus, la destination de connexion est https://idp.example.net/saml/sso. Éviter les doubles slashs, les slashs manquants et les chemins déjà porteurs d’une chaîne de requête : le service ajoute lui-même ?SAMLRequest=.
FidSloPath et LogoutUrl concernent le parcours de déconnexion. Pour un raccordement comprenant ce parcours, les renseigner et le tester séparément de la connexion.
{
"Saml": {
"FidUrl": "https://idp.example.net",
"FidSsoPath": "/saml/sso",
"FidSloPath": "/saml/slo",
"EntityId": "urn:example:immersive:recette",
"LoginUrl": "https://rest.example.net/api/Saml/Login",
"LogoutUrl": "https://rest.example.net/api/Saml/Logout"
}
}
Les chemins /saml/sso et /saml/slo sont illustratifs. Les remplacer par les adresses fournies par l’administrateur de l’IdP. Reporter le préfixe public éventuel de RestFrontage dans LoginUrl et LogoutUrl.
Voir la présentation du fichier de Configuration du Rest Frontage
4.2 Déclarer le service auprès de l’IdP
- Déclarer l’application ou le fournisseur de service correspondant à Immersive dans l’environnement cible.
- Reporter la valeur EntityId à l’identique comme identifiant du fournisseur de service.
- Déclarer LoginUrl comme URL ACS recevant la réponse par HTTP POST.
- Pour la déconnexion fédérée, déclarer le retour LogoutUrl et vérifier le comportement attendu par l’IdP.
- Configurer les attributs nécessaires au rapprochement du compte et prévoir un utilisateur pilote autorisé à accéder à cette application.
- Vérifier les exigences de signature et de validation décrites dans le chapitre sur les limites avant toute ouverture en production.
Le service émet une AuthnRequest SAML 2.0, compressée avec Deflate puis encodée en Base64 et dans l’URL. Il indique un retour HTTP POST et une politique NameID de format transient. Lorsque forceAuthentication vaut true, il ajoute ForceAuthn à la demande.
Ces caractéristiques doivent être acceptées par l’IdP. Le code examiné ne fournit pas d’URL de métadonnées SAML ni d’option de certificat de signature dans SamlOptions. Il ne suffit donc pas d’inventer un paramètre MetadataUrl ou Certificate pour les activer.
4.3 Données attendues dans la réponse
| Donnée | Utilisation |
|---|---|
| InResponseTo sur la réponse SAML | Repris comme identifiant de demande, pour retrouver le parcours lancé par le client. |
| SessionIndex dans AuthnStatement | Nécessaire à la reconnaissance de la réponse de connexion ; conservé pour la déconnexion. |
| Attribut cn | Premier attribut recherché pour le nom de compte externe. |
| Attribut http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name | Alternative utilisée si cn est absent. |
La correspondance de compte repose sur un attribut SAML. La seule présence d’un NameID, d’une adresse électronique ou d’un attribut sub ne remplace pas cn ou l’attribut de nom attendu. Si cn est présent, il est prioritaire sur l’attribut alternatif.
Configurer une valeur simple et unique pour cet attribut. Le parseur retient le premier AttributeValue de chaque attribut ; les groupes et attributs multiples ne constituent pas un mécanisme d’attribution de droits.
4.4 Parcours de connexion
Un client comme le Beholder va suivre les étapes suivantes pour effectuer une connexion via le SSO SAML.
Le client prépare automatiquement deux valeurs pour démarrer la connexion. requestId est un identifiant généré à chaque nouvelle tentative : il permet de relier la demande SAML au retour du fournisseur d’identité.
Immersive Beholder génère un GUID et construit un identifiant contenant également l’adresse de retour. forceAuthentication est un choix du client : la valeur false autorise le fournisseur d’identité à réutiliser une session existante, selon sa politique, tandis que true demande une nouvelle authentification, même si une session existe déjà. Le Beholder utilise false par défaut. Ces deux valeurs sont gérées par le client : l’administrateur n’a rien à récupérer ni à saisir.
Les étapes sont les suivantes :
- Le client crée un identifiant de demande propre à la tentative et appelle GET
/api/Saml/GetSamlUrlavec requestId et forceAuthentication. - RestFrontage retourne une chaîne JSON contenant l’URL de connexion SAML ; cet appel ne redirige pas directement le navigateur.
- Le client ouvre cette URL et l’utilisateur s’authentifie auprès de l’IdP.
- Après l’authentification, le fournisseur d’identité fait transmettre la réponse SAML par le navigateur, en HTTP POST, à l’URL renseignée dans
Saml:LoginUrl. Dans notre exemple précédent, cette valeur esthttps://rest.example.net/api/Saml/Login: elle désigne le point de réception fourni par RestFrontage pour lui laisser gérer automatiquement le traitement du retour SAML. - RestFrontage extrait les données attendues et tente d’enregistrer la demande et l’index de session sur le compte externe correspondant.
- Le client chiffre l’identifiant de demande avec le contexte de sécurité Immersive et l’envoie à POST /api/Saml/Authenticate.
- RestFrontage retrouve le compte, contrôle son état et retourne un AuthenticationToken contenant le jeton et l’utilisateur Immersive.
Une page de retour SAML ou une redirection LoggedIn=ok ne prouve pas que le compte Immersive est authentifié. La validation fonctionnelle doit aller jusqu’à la réussite de /api/Saml/Authenticate et à l’accès attendu dans l’application.
Pour les clients qui utilisent une redirection, le code sait interpréter un identifiant contenant une destination _redirect=, éventuellement encodé en hexadécimal. Les lanceurs présents dans RestFrontage construisent ce format. Utiliser le client prévu pour cette intégration plutôt que fabriquer une URL de retour arbitraire.
4.5 Déconnexion SAML
Un utilisateur Immersive authentifié peut demander GET /api/Saml/GetSamlLogoutUrl avec un requestId. Le service construit la demande de déconnexion à partir du compte externe et du SessionIndex conservé. L’IdP renvoie ensuite sa réponse sur /api/Saml/Logout, qui accepte GET et POST.
La fermeture de session chez l’IdP, l’effacement des données du client et l’invalidation des accès Immersive sont des opérations distinctes. Le retour Logout examiné affiche une page ou redirige ; il ne révoque pas explicitement les jetons Immersive dans cette méthode. Vérifier le comportement complet du client avant de considérer la déconnexion comme effective sur tous les accès.
5. Configurer le parcours OpenID
5.1 Différence avec un raccordement OIDC standard
OpenID Connect est une couche d’identité construite sur OAuth 2.0. Le standard définit notamment l’ID Token et le point de terminaison UserInfo. Voir la spécification OpenID Connect Core.
Le contrôleur OpenID de RestFrontage utilise un parcours particulier : le client a déjà obtenu un jeton d’accès externe et RestFrontage interroge les services tokeninfo et userinfo. Il ne configure pas, dans ce chemin, une découverte automatique .well-known/openid-configuration, un échange de code d’autorisation, une validation d’ID Token ou un renouvellement de jeton.
Ainsi, Authority, MetadataAddress, CallbackPath ou une URL /signin-oidc ne sont pas des paramètres de la section OpenID examinée. Les URL de redirection, scopes et modalités d’obtention du jeton sont à définir dans l’intégration entre l’application cliente et l’IdP.
5.2 Paramètres RestFrontage
| Paramètre | Rôle effectif |
|---|---|
| OpenID:FidUrl | URL de base utilisée par RestFrontage pour appeler tokeninfo et userinfo. Prévoir un slash final si les services se trouvent sous un chemin. |
| OpenID:FidAppId | Identifiant comparé au client_id retourné par tokeninfo. À renseigner pour l’application autorisée. |
| OpenID:FidAppSecret | Option existante dans le modèle, mais non utilisée par les appels du contrôleur examiné. Elle n’active pas une authentification du client auprès de tokeninfo. |
Exemple minimal des paramètres effectivement utilisés par le contrôleur :
{
"OpenID": {
"FidUrl": "https://idp.example.net/oauth2/",
"FidAppId": "immersive-recette"
}
}
Avec cette base, les appels visent https://idp.example.net/oauth2/tokeninfo et https://idp.example.net/oauth2/userinfo. Sans le slash final après oauth2, la résolution d’une URL relative peut supprimer ce segment et viser un autre emplacement.
Si une autre partie de votre intégration exige un secret, le fournir avec le mécanisme de secrets de l’hébergement. Dans ce contrôleur, renseigner FidAppSecret ne change pas le comportement des appels sortants. Une exigence de Basic authentication ou de client_secret sur tokeninfo nécessite une adaptation de l’intégration.
5.3 Contrat attendu de tokeninfo
RestFrontage effectue un appel GET relatif à FidUrl :
tokeninfo?access_token=JETON_ACCES_EXTERNE
Le contrôleur n’ajoute pas d’en-tête d’authentification à cet appel. Il attend une réponse JSON dont les champs exploités sont les suivants :
{
"access_token": "JETON_ACCES_RETOURNE_PAR_IDP",
"client_id": "immersive-recette",
"realm": "/environnement-exemple"
}
La valeur client_id doit correspondre à FidAppId ; cette comparaison ignore la casse. Le jeton access_token renvoyé est ensuite utilisé pour appeler userinfo. Le champ realm sert de paramètre de cette deuxième requête.
Ces champs décrivent le contrat spécifique consommé par le code. Une réponse d’introspection qui ne contient que active, sub ou scope ne suffit pas à alimenter ce parcours. Le contrôleur ne vérifie pas explicitement un booléen active ni une durée expires_in.
5.4 Contrat attendu de userinfo
RestFrontage effectue ensuite cet appel, avec realm encodé dans l’URL :
GET /oauth2/userinfo?realm=%2Fenvironnement-exemple HTTP/1.1
Host: idp.example.net
Authorization: Bearer JETON_ACCES_RETOURNE_PAR_IDP
La réponse JSON doit notamment fournir le champ login utilisé pour retrouver le compte Immersive :
{
"sub": "identifiant-externe-stable",
"login": "agent.demo"
}
Dans ce parcours, la correspondance s’effectue sur login. Le contrôleur ne rapproche pas le compte à partir de sub, de l’adresse électronique ou d’un groupe. Le champ login est une exigence de cette intégration ; ce n’est pas un attribut garanti par tous les fournisseurs OIDC.
Le standard prévoit notamment la vérification de la cohérence de sub entre UserInfo et l’ID Token. Ce contrôle n’est pas réalisé dans le chemin examiné, qui ne valide pas l’ID Token. Voir UserInfo dans OpenID Connect Core.
5.5 Parcours de connexion
- L’application cliente obtient un jeton d’accès externe auprès de l’IdP selon son propre parcours de connexion.
- Elle peut appeler GET /api/OpenID/CheckToken avec le jeton en paramètre token pour vérifier les échanges tokeninfo et userinfo.
- Elle récupère le contexte de sécurité Immersive, chiffre le jeton externe et l’envoie à POST /api/OpenID/Authenticate.
- RestFrontage appelle tokeninfo, compare client_id, puis appelle userinfo.
- RestFrontage rapproche login du compte Immersive, contrôle son état et retourne un AuthenticationToken.
Les deux routes OpenID exigent que l’en-tête Authorization puisse être analysé. Toutefois, les valeurs de cet en-tête ne sont pas exploitées par la méthode privée CheckToken : le jeton réellement traité provient du paramètre token ou du corps déchiffré, selon la route. L’en-tête reçu n’authentifie donc pas à lui seul l’application cliente dans ce chemin.
Un retour 204 de CheckToken confirme uniquement que cette méthode a pu obtenir une réponse userinfo après son contrôle de client_id. Il ne vérifie ni l’existence du compte Immersive correspondant, ni son état, ni ses droits. Seule la suite du parcours permet de valider l’accès à Immersive.
6. Configurer l’application cliente et les accès
6.1 Activer le bon parcours côté client
Les options serveur ne sélectionnent pas automatiquement le mode de connexion dans toutes les applications clientes. Le lanceur ou le client doit être configuré pour le protocole attendu et pour l’URL de RestFrontage.
La valeur de Login.Modes dans le fichier UserInfos.txt du Beholder doit contenir au minimum la valeur SAML pour permettre la connexion via le SAML et/ou OIDC pour OpenId.
Exemple : la valeur suivante permet un Beholder d'autoriser la connexion par défaut en login/password via les comptes Immersive mais aussi en SAML et OIDC :
"Login.Modes" : "SAML|OIDC|DEFAULT"
Les scripts Reader et Beholder examinés conservent l’identifiant SSO dans un cookie SSOToken pendant 30 secondes. Une connexion lente ou une étape multifacteur peut dépasser cette durée : si le retour SAML réussit mais que le lanceur recommence la connexion, contrôler ce point dans la version du client déployée.
6.2 Utiliser le contexte de sécurité Immersive
GET /api/Security/Context fournit un SecurityToken contenant la clé publique de chiffrement. Les routes Authenticate attendent ensuite une chaîne JSON chiffrée avec le mécanisme RSA compatible avec Immersive.
| Route | Donnée à chiffrer |
|---|---|
| POST /api/Saml/Authenticate | Identifiant de demande reconnu après le retour SAML. |
| POST /api/OpenID/Authenticate | Jeton d’accès externe obtenu auprès de l’IdP. |
La forme du corps HTTP est une chaîne JSON, comme dans cet exemple de structure non exécutable :
"DONNEE_CHIFFREE_PAR_LE_CLIENT_IMMERSIVE"
Ce corps n’est ni un objet contenant encryptedData, ni un identifiant en clair, ni le XML SAML. Utiliser l’implémentation de chiffrement compatible fournie au client. La clé publique ne remplace pas HTTPS.
6.3 Vérifier les droits après connexion
Après émission du jeton, vérifier l’identité Immersive effectivement retournée, les groupes du compte et ses droits sur les fonctions et objets nécessaires. Tester aussi une fonction qui doit rester interdite au compte pilote.
Les contrôleurs SAML et OpenID ne constituent pas une ouverture globale des droits. Le SSO établit l’identité ; les règles d’autorisation de la plateforme déterminent ensuite les accès.
7. Référence des routes
| Méthode et route | Usage | Contexte attendu |
|---|---|---|
| GET /api/Security/Context | Fournit la clé publique Immersive. | Accessible avant authentification. |
| GET /api/Saml/GetSamlUrl | Renvoie l’URL IdP sous forme de chaîne JSON. | requestId et forceAuthentication ; accessible avant authentification. |
| POST /api/Saml/Login | Reçoit le retour SAML de connexion. | Réponse SAML transmise par le navigateur depuis l’IdP. |
| POST /api/Saml/Authenticate | Échange la demande SAML contre un jeton Immersive. | Identifiant chiffré dans une chaîne JSON. |
| GET /api/Saml/GetSamlLogoutUrl | Renvoie l’URL de déconnexion IdP. | Utilisateur Immersive authentifié et requestId. |
| GET ou POST /api/Saml/Logout | Reçoit le retour de déconnexion SAML. | SAMLResponse dans le format attendu par le contrôleur. |
| GET /api/OpenID/CheckToken | Exécute les appels externes de vérification. | token en paramètre de requête et en-tête Authorization analysable. |
| POST /api/OpenID/Authenticate | Échange le jeton externe contre un jeton Immersive. | Jeton externe chiffré dans une chaîne JSON et en-tête Authorization analysable. |
Le contrôle direct du jeton OpenID le place dans l’URL, tout comme l’appel sortant à tokeninfo. Éviter d’enregistrer ces URL avec leurs paramètres dans les journaux d’accès ou dans un dossier de support non expurgé.
8. Recetter le raccordement
8.1 Vérifications communes
- Les URL correspondent à l’environnement cible et sont accessibles par les composants concernés.
- La configuration effective tient compte des éventuelles surcharges ; RestFrontage a été redémarré.
- Le compte pilote existe, possède un nom de compte externe unique et est activé, non expiré et non verrouillé.
- Une connexion complète retourne le bon utilisateur et un jeton Immersive.
- Le compte accède à une fonction autorisée et ne peut pas accéder à une fonction interdite.
- Un utilisateur externe sans compte Immersive correspondant n’obtient pas de jeton Immersive.
- Un compte Immersive désactivé, expiré ou verrouillé n’obtient pas de jeton.
- La déconnexion, la fermeture du client et la reconnexion ont été vérifiées séparément.
8.2 Vérifications SAML
- L’URL générée vise la bonne destination et la demande contient le bon EntityId et la bonne ACS.
- Le retour atteint /api/Saml/Login avec InResponseTo, SessionIndex et l’attribut de compte attendu.
- La connexion aboutit jusqu’à /api/Saml/Authenticate ; la page de retour seule n’est pas utilisée comme preuve.
- Une nouvelle tentative utilise un nouvel identifiant de demande ; le comportement de prévention du rejeu est contrôlé.
- Un parcours avec authentification multifacteur ou connexion lente aboutit aussi dans le client déployé.
- Les garanties de validation des assertions exposées au chapitre suivant sont effectivement présentes avant la mise en production.
8.3 Vérifications OpenID
- Depuis RestFrontage, FidUrl résout correctement tokeninfo et userinfo.
- tokeninfo fournit les champs requis et client_id correspond à FidAppId.
- userinfo fournit un login non vide correspondant au compte pilote.
- Un jeton expiré, révoqué ou émis pour une autre application est refusé sur le parcours complet.
- Les exigences d’authentification des services de l’IdP sont compatibles avec les appels réellement émis.
- La compatibilité de l’application cliente, de l’IdP et de cette version de RestFrontage est établie au-delà d’un seul retour 204.
Ces points constituent un plan de recette à exécuter. Ils ne décrivent pas des essais déjà réalisés sur un serveur ou un IdP.
9. Diagnostiquer les difficultés courantes
| Symptôme | Vérification prioritaire |
|---|---|
| L’URL de connexion SAML est incorrecte | Vérifier la concaténation FidUrl + FidSsoPath et la configuration réellement chargée. |
| L’IdP refuse la demande SAML | Comparer EntityId, ACS, binding, politique NameID et exigences de signature avec la déclaration IdP. |
| Le retour de connexion affiche une erreur ou reste sans résultat utile | Vérifier le format du retour, InResponseTo, SessionIndex, cn ou l’attribut de nom alternatif. Un simple code HTTP réussi n’est pas une preuve de connexion complète. |
| La page de retour apparaît, mais Authenticate échoue | Vérifier le compte externe, l’identifiant de demande transmis, sa consommation éventuelle et le chiffrement du corps. |
| Le lanceur boucle après le retour SAML | Vérifier les cookies, la destination de retour et la durée de 30 secondes de SSOToken dans les lanceurs concernés. |
| Invalid request for given user en OpenID | Vérifier les deux appels IdP, client_id, login et le rattachement au compte Immersive. |
| CheckToken réussit, mais Authenticate échoue | Vérifier l’existence et l’état du compte Immersive ainsi que le chiffrement du jeton externe. |
| tokeninfo ou userinfo retourne 404 | Vérifier FidUrl, son slash final et les chemins réels de l’IdP. |
| L’IdP exige un secret malgré FidAppSecret renseigné | Le contrôleur n’utilise pas ce secret pour ses appels ; faire adapter le raccordement. |
| Le compte est signalé comme verrouillé ou désactivé | Vérifier IsEnabled, ExpirationDate et LockoutUntilUtc dans le compte Immersive. |
| La connexion réussit, mais un accès métier est refusé | Vérifier les habilitations Immersive ; l’authentification externe n’accorde pas les droits métier. |
| La déconnexion IdP n’arrête pas tous les accès | Vérifier les données de session du client et le cycle de vie du jeton Immersive. |
Les journaux peuvent notamment contenir « Demande Connexion SSO pour le CN extérieur », « Connexion SSO pour le CN extérieur », « Echec connexion SSO pour la requête » ou un événement de compte désactivé ou verrouillé. Corréler l’heure, le compte pilote et l’étape du parcours. Expurger jetons, réponses SAML et données personnelles avant de transmettre des traces.
10. Limites de la version examinée
10.1 Validation SAML à traiter avant une exposition en production
Le chemin examiné décode la réponse SAML et extrait ses attributs. Il ne montre pas de vérification cryptographique de signature, de chaîne de confiance IdP, d’audience, de destinataire, de statut SAML ou de conditions temporelles de l’assertion. Aucune option de certificat ou de métadonnées IdP n’est exposée par SamlOptions.
La présence de ces données dans une réponse n’en prouve donc pas l’authenticité. Les exigences de validation du profil SSO sont décrites dans les profils SAML 2.0 d’OASIS, section 4.1.
La configuration présentée documente les échanges existants ; elle ne rend pas, à elle seule, le traitement des assertions SAML conforme aux exigences de validation. Avant une exposition en production, faire ajouter ces contrôles ou établir qu’un composant de confiance les applique effectivement et que le point de réception ne peut pas être contourné. Cette garantie n’a pas été établie par la présente analyse.
Le code conserve la demande et l’index de session dans le champ Code de l’utilisateur. Il tente d’effacer l’identifiant de demande lors de son échange contre un jeton. Cette consommation n’est pas une vérification de signature et ne suffit pas à démontrer une protection complète contre le rejeu ; le résultat de la méthode d’effacement n’est pas imposé comme condition de réussite par l’appelant.
Le parseur lit également le corps du retour SAML comme une chaîne et retire le préfixe SAMLResponse=. Il ne traite pas ce corps comme un ensemble complet de champs de formulaire. Recetter les réponses réelles de l’IdP, notamment lorsqu’elles comportent RelayState ou d’autres champs.
10.2 Compatibilité OpenID à confirmer
Le code contrôle client_id puis exploite login. Il ne met pas en œuvre une validation générique de jeton OIDC, ni une correspondance stable fondée sur le couple issuer et subject. Il ne vérifie pas explicitement active, les scopes ou l’expiration dans tokeninfo. Le refus d’un jeton révoqué ou expiré doit donc être confirmé dans le comportement réel des services IdP et dans la recette complète.
Le secret configuré n’est pas utilisé dans ce chemin. Les en-têtes d’autorisation reçus ne sont pas utilisés comme preuve d’identité du client appelant. Ces points limitent les contrats IdP compatibles et doivent être pris en compte si une authentification du client est exigée.
Ne pas annoncer une compatibilité validée avec Microsoft Entra ID, Keycloak, AD FS ou un autre fournisseur sur la seule présence des routes SAML et OpenID. Chaque fournisseur et chaque version nécessitent une vérification du contrat et du parcours complet.