<!DOCTYPE html>
<html lang="fr" data-theme="light">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Module 10 — Collaboration B2B · Formation Entra ID · Atoo Next</title>
  <meta name="description" content="Invités B2B, accès inter-locataires, Entra External ID CIAM (aperçu).">
  <meta name="color-scheme" content="light dark">
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Instrument+Serif:ital@0;1&family=JetBrains+Mono:wght@400;500&display=swap">
  <link rel="stylesheet" href="assets/shared.css">
</head>
<body class="layout-module">
  <a href="#main-content" class="skip-link">Aller au contenu principal</a>

  <svg xmlns="http://www.w3.org/2000/svg" style="display:none" aria-hidden="true">
    <symbol id="icon-home" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></symbol>
    <symbol id="icon-book-open" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M12 7v14"/><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"/></symbol>
    <symbol id="icon-trending-up" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 7 13.5 15.5 8.5 10.5 2 17"/><polyline points="16 7 22 7 22 13"/></symbol>
    <symbol id="icon-award" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M15.477 12.89 17 22l-5-3-5 3 1.523-9.11"/><circle cx="12" cy="8" r="6"/></symbol>
    <symbol id="icon-settings" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/></symbol>
    <symbol id="icon-help-circle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><path d="M12 17h.01"/></symbol>
    <symbol id="icon-menu" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><line x1="4" x2="20" y1="12" y2="12"/><line x1="4" x2="20" y1="6" y2="6"/><line x1="4" x2="20" y1="18" y2="18"/></symbol>
    <symbol id="icon-user-plus" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><line x1="19" x2="19" y1="8" y2="14"/><line x1="22" x2="16" y1="11" y2="11"/></symbol>
    <symbol id="icon-users" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M22 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></symbol>
    <symbol id="icon-globe" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" x2="22" y1="12" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></symbol>
    <symbol id="icon-mail" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="16" x="2" y="4" rx="2"/><path d="m22 7-10 5L2 7"/></symbol>
    <symbol id="icon-check" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></symbol>
    <symbol id="icon-check-circle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></symbol>
    <symbol id="icon-x" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><line x1="18" x2="6" y1="6" y2="18"/><line x1="6" x2="18" y1="6" y2="18"/></symbol>
    <symbol id="icon-refresh-cw" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 4 23 10 17 10"/><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10"/></symbol>
    <symbol id="icon-chevron-right" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"/></symbol>
    <symbol id="icon-arrow-left" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><line x1="19" x2="5" y1="12" y2="12"/><polyline points="12 19 5 12 12 5"/></symbol>
    <symbol id="icon-arrow-right" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><line x1="5" x2="19" y1="12" y2="12"/><polyline points="12 5 19 12 12 19"/></symbol>
    <symbol id="icon-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></symbol>
    <symbol id="icon-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2"/><path d="M12 20v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/><path d="M2 12h2"/><path d="M20 12h2"/><path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/></symbol>
    <symbol id="icon-alert-triangle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></symbol>
    <symbol id="icon-info" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></symbol>
    <symbol id="icon-key-round" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z"/></symbol>
    <symbol id="icon-sparkles" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"/><path d="M20 3v4"/><path d="M22 5h-4"/><path d="M4 17v2"/><path d="M5 18H3"/></symbol>
    <symbol id="icon-server" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="8" x="2" y="2" rx="2"/><rect width="20" height="8" x="2" y="14" rx="2"/><line x1="6" x2="6.01" y1="6" y2="6"/><line x1="6" x2="6.01" y1="18" y2="18"/></symbol>
    <symbol id="icon-graduation-cap" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M22 10v6M2 10l10-5 10 5-10 5z"/><path d="M6 12v5c3 3 9 3 12 0v-5"/></symbol>
    <symbol id="icon-flask-conical" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2"/><path d="M6.453 15h11.094"/><path d="M8.5 2h7"/></symbol>
    <symbol id="icon-target" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="6"/><circle cx="12" cy="12" r="2"/></symbol>
    <symbol id="icon-list" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><line x1="8" x2="21" y1="6" y2="6"/><line x1="8" x2="21" y1="12" y2="12"/><line x1="8" x2="21" y1="18" y2="18"/><line x1="3" x2="3.01" y1="6" y2="6"/><line x1="3" x2="3.01" y1="12" y2="12"/><line x1="3" x2="3.01" y1="18" y2="18"/></symbol>
    <symbol id="icon-external-link" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" x2="21" y1="14" y2="3"/></symbol>
    <symbol id="icon-package" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M16.5 9.4 7.55 4.24"/><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/><path d="M3.27 6.96 12 12.01l8.73-5.05"/><path d="M12 22.08V12"/></symbol>
    <symbol id="icon-building" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><rect width="16" height="20" x="4" y="2" rx="2" ry="2"/><path d="M9 22v-4h6v4"/><path d="M8 6h.01"/><path d="M16 6h.01"/><path d="M12 6h.01"/><path d="M12 10h.01"/><path d="M12 14h.01"/><path d="M16 10h.01"/><path d="M16 14h.01"/><path d="M8 10h.01"/><path d="M8 14h.01"/></symbol>
  </svg>

  <button class="hamburger-btn" aria-label="Ouvrir le menu">
    <svg width="24" height="24"><use href="#icon-menu"/></svg>
  </button>

  <aside class="sidebar-icons" role="navigation" aria-label="Menu principal">
    <a href="javascript:void(0)" class="sidebar-icons__logo" aria-label="Accueil Atoo Next">
      <img src="assets/atoo-next-logo.svg" alt="Atoo Next">
    </a>
    <nav class="sidebar-icons__nav" aria-label="Navigation principale">
      <a href="javascript:void(0)" class="sidebar-icons__item" aria-label="Tableau de bord" title="Tableau de bord"><svg><use href="#icon-home"/></svg></a>
      <a href="#module-content" class="sidebar-icons__item is-active" aria-label="Ce module" title="Ce module"><svg><use href="#icon-book-open"/></svg></a>
      <a href="javascript:void(0)" class="sidebar-icons__item" aria-label="Progression" title="Progression"><svg><use href="#icon-trending-up"/></svg></a>
      <a href="javascript:void(0)" class="sidebar-icons__item" aria-label="Certificat" title="Certificat"><svg><use href="#icon-award"/></svg></a>
    </nav>
    <div class="sidebar-icons__footer">
      <a href="#" class="sidebar-icons__item" aria-label="Aide" title="Aide"><svg><use href="#icon-help-circle"/></svg></a>
      <a href="#" class="sidebar-icons__item" aria-label="Paramètres" title="Paramètres"><svg><use href="#icon-settings"/></svg></a>
    </div>
  </aside>

  <main class="module-main" id="main-content">
    <header class="module-topbar">
      <a href="javascript:void(0)" class="back-link">
        <svg><use href="#icon-arrow-left"/></svg>
        Retour au tableau de bord
      </a>
      <div class="module-topbar__actions">
        <button id="theme-toggle" class="btn-icon" aria-label="Basculer thème" aria-pressed="false">
          <svg width="20" height="20"><use href="#icon-moon"/></svg>
        </button>
      </div>
    </header>

    <div class="module-layout" id="module-content">
      <article class="module-content">
        <header class="module-header">
          <div class="module-header__visual module-header__visual--lavender">
            <span class="module-header__number-huge">10</span>
            <div class="module-header__icon-large"><svg><use href="#icon-user-plus"/></svg></div>
          </div>
          <div class="module-header__meta">
            <span class="module-header__label">MODULE 10 · COURS</span>
            <h1 class="module-header__title">Collaboration B2B</h1>
            <p class="module-header__subtitle">Invités B2B, accès inter-locataires, Entra External ID CIAM (aperçu).</p>
            <div class="module-header__stats">
              <div class="stat-mini"><span class="stat-mini__value">3h</span><span class="stat-mini__label">durée</span></div>
              <div class="stat-mini"><span class="stat-mini__value" id="module-sections-count">12</span><span class="stat-mini__label">sections</span></div>
              <div class="stat-mini"><span class="stat-mini__value">10</span><span class="stat-mini__label">questions</span></div>
            </div>
          </div>
        </header>

        <!-- OBJECTIFS -->
        <section class="module-section module-section--objectifs" data-section-id="s-objectifs">
          <div class="section-header">
            <div class="icon-circle icon-circle--lg icon-circle--lavender"><svg><use href="#icon-target"/></svg></div>
            <div class="section-header__content">
              <span class="section-header__label">OBJECTIFS</span>
              <h2 class="section-header__title">Ce que vous saurez faire</h2>
              <p class="section-header__meta">5 objectifs · ~5 min</p>
            </div>
          </div>
          <ul class="task-list">
            <li class="task-list__item"><span><strong>Distinguer</strong> la collaboration B2B (invités partenaires) de l'External ID pour les clients (CIAM), et choisir le bon modèle selon le public.</span></li>
            <li class="task-list__item"><span><strong>Inviter</strong> un utilisateur externe, comprendre son cycle de vie (invitation, rédemption, objet <code>Guest</code>) et l'état d'acceptation.</span></li>
            <li class="task-list__item"><span><strong>Configurer</strong> les paramètres d'accès inter-locataires (cross-tenant access settings) entrants et sortants pour cadrer la confiance avec un partenaire.</span></li>
            <li class="task-list__item"><span><strong>Gouverner</strong> les accès invités avec les revues d'accès et les packages d'accès (entitlement management), déployables en Entra ID P2.</span></li>
            <li class="task-list__item"><span><strong>Situer</strong> les fonctions premium d'Entra External ID (CIAM) comme <em>à connaître, non déployables</em> en E3+P2, et connaître l'alternative B2B.</span></li>
          </ul>
          <div class="content-block animate-on-scroll" style="margin-top:var(--space-6)">
            <h3>Compétences transférées depuis l'AD classique</h3>
            <div class="table-wrapper">
              <table>
                <thead><tr><th>L'admin AD réutilise</th><th>L'admin AD doit désapprendre</th></tr></thead>
                <tbody>
                  <tr><td>Relations d'approbation (trusts) inter-forêts</td><td>« Un trust est un tunnel réseau permanent entre domaines » — le B2B fédère des <strong>identités</strong>, pas des réseaux</td></tr>
                  <tr><td>Gestion du cycle de vie des comptes</td><td>« Un partenaire = un compte que je crée et dont je gère le mot de passe » — l'invité s'authentifie chez <strong>lui</strong></td></tr>
                  <tr><td>Délégation d'accès à des tiers</td><td>Aucun équivalent AD : la confiance se règle par locataire via les <strong>cross-tenant access settings</strong></td></tr>
                </tbody>
              </table>
            </div>
          </div>
        </section>

        <!-- COURS -->
        <section class="module-section module-section--cours">
          <div class="section-header">
            <div class="icon-circle icon-circle--lg icon-circle--sky"><svg><use href="#icon-book-open"/></svg></div>
            <div class="section-header__content">
              <span class="section-header__label">COURS</span>
              <h2 class="section-header__title">Fédérer les identités, pas dupliquer les comptes</h2>
              <p class="section-header__meta">5 sections · lecture ~35 min</p>
            </div>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-cours-1">
            <h3>1. Les deux visages d'Entra External ID</h3>
            <div class="section-hook">
              <span class="section-hook__label">Contexte</span>
              Un cabinet partenaire démarre demain. Le premier réflexe transposé de l'AD : « je crée un compte à chaque consultant ». C'est une erreur. Le B2B fédère des <strong>identités existantes</strong> — le consultant s'authentifie chez lui, vous ne gérez ni son mot de passe ni sa MFA.
            </div>
            <p>« Entra External ID » recouvre deux scénarios opposés qu'il ne faut jamais confondre :</p>
            <div class="table-wrapper">
              <table>
                <thead><tr><th>Scénario</th><th>Public</th><th>Le partenaire s'authentifie…</th><th>Facturation</th></tr></thead>
                <tbody>
                  <tr><td><strong>Collaboration B2B</strong> (workforce)</td><td>Partenaires, prestataires, fournisseurs</td><td>dans <strong>son propre</strong> tenant (ou via OTP e-mail)</td><td>Inclus (Free / P1 / P2)</td></tr>
                  <tr><td><strong>External ID pour les clients</strong> (CIAM)</td><td>Clients, grand public, utilisateurs d'une app</td><td>dans un tenant <strong>external</strong> dédié que vous exposez</td><td>À l'usage (<strong>MAU</strong>)</td></tr>
                </tbody>
              </table>
            </div>
            <p>Ce module traite <strong>la collaboration B2B</strong> en profondeur (déployable en E3+P2) et <strong>situe</strong> le CIAM comme non déployable en l'état (section 5).</p>
            <div class="ad-entra-grid">
              <div class="ad-entra-card ad-entra-card--ad">
                <div class="ad-entra-card__label"><svg width="14" height="14"><use href="#icon-server"/></svg> AD CLASSIQUE</div>
                <div class="ad-entra-card__body"><p>Un partenaire = un compte dans votre annuaire, ou un trust inter-forêts.</p></div>
              </div>
              <div class="ad-entra-card ad-entra-card--entra">
                <div class="ad-entra-card__label"><svg width="14" height="14"><use href="#icon-user-plus"/></svg> ENTRA / B2B</div>
                <div class="ad-entra-card__body"><p>Un partenaire = une <strong>identité invitée</strong> (<code>Guest</code>) qui reste gérée et authentifiée dans <strong>son</strong> organisation.</p></div>
              </div>
              <div class="ad-entra-card ad-entra-card--danger">
                <div class="ad-entra-card__label"><svg width="14" height="14"><use href="#icon-alert-triangle"/></svg> PIÈGE</div>
                <div class="ad-entra-card__body"><p>Créer un compte membre « maison » au prestataire, avec mot de passe transmis. On multiplie les identités et les secrets à gérer.</p></div>
              </div>
            </div>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-cours-2">
            <h3>2. Cycle de vie d'un invité B2B</h3>
            <p>Inviter un externe crée dans <strong>votre</strong> tenant un objet utilisateur de type <code>Guest</code>, distinct d'un <code>Member</code> :</p>
            <ul>
              <li><strong>UPN caractéristique :</strong> <code>alice_contoso.com#EXT#@votretenant.onmicrosoft.com</code>. Le <code>#EXT#</code> signale un objet externe dont l'identité source vit ailleurs.</li>
              <li><strong><code>userType = Guest</code></strong> : l'attribut qui pilote les restrictions d'accès invité et sert de filtre partout (Conditional Access, revues d'accès).</li>
              <li><strong>État d'invitation :</strong> <code>PendingAcceptance</code> tant que l'invité n'a pas <strong>redéemé</strong> le lien, puis <code>Accepted</code> après consentement. Un invité non redéemé existe déjà comme objet mais n'a pas encore d'accès effectif.</li>
            </ul>
            <p>Comment l'externe prouve son identité (par ordre de préférence) :</p>
            <ol>
              <li><strong>Compte Entra existant</strong> : il se connecte dans son tenant d'origine (home realm), fédération Entra-à-Entra native.</li>
              <li><strong>Fédération directe / Google</strong> : SAML / WS-Fed avec l'IdP du partenaire, ou fournisseur Google.</li>
              <li><strong>Code à usage unique par e-mail (Email OTP)</strong> : repli pour un externe sans identité fédérable.</li>
            </ol>

            <figure class="mermaid-container animate-on-scroll" data-mermaid-source='sequenceDiagram
  participant A as Admin (vous)
  participant V as Votre tenant
  participant I as Invité (alice@contoso.com)
  participant H as Tenant contoso.com
  A->>V: 1. Invite alice@contoso.com
  V->>V: 2. Crée objet Guest<br>PendingAcceptance
  V->>I: 3. Envoi du lien d&#39;invitation
  I->>H: 4. Clic sur le lien →<br>authentification chez elle
  H-->>I: 5. Jeton Contoso
  I->>V: 6. Redémption + consentement
  V->>V: 7. État = Accepted<br>Guest actif
  Note over V,H: Auth ultérieure : Alice se connecte<br>toujours chez Contoso, vous recevez un jeton'>
              <div class="mermaid-render"><em class="text-muted">Chargement du schéma…</em></div>
              <figcaption class="mermaid-caption">Cycle de vie B2B : invitation → rédemption → accès. L'authentification reste chez le partenaire, à vie.</figcaption>
            </figure>

            <div class="reveal-card">
              <button class="reveal-card__trigger" aria-controls="ade-cours2">
                <div class="icon-circle icon-circle--sm icon-circle--sky"><svg><use href="#icon-server"/></svg></div>
                <span class="reveal-card__title">Équivalent AD DS</span>
                <svg class="reveal-card__chevron" width="20" height="20"><use href="#icon-chevron-right"/></svg>
              </button>
              <div class="reveal-card__content" id="ade-cours2" role="region"><p>L'authentification d'un compte local se fait <strong>chez vous</strong>, contre votre DC. Aucun équivalent au principe « l'invité s'authentifie chez lui » — c'est la vraie rupture conceptuelle.</p></div>
            </div>

            <aside class="callout callout--warning">
              <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
              <div class="callout__content">
                <span class="callout__label">PIÈGE FRÉQUENT</span>
                <p>Croire qu'on peut réinitialiser le mot de passe d'un invité. Aucun équivalent AD : vous n'êtes pas l'autorité d'authentification de l'invité. Si vous voulez couper l'accès, révoquez sa session ou supprimez l'objet <code>Guest</code>.</p>
              </div>
            </aside>

            <h4>Paramètres de collaboration externe</h4>
            <p>Sous <code>External Identities &gt; External collaboration settings</code>, deux réglages structurants :</p>
            <ul>
              <li><strong>Qui peut inviter :</strong> par défaut, tout utilisateur (voire les invités eux-mêmes) peut inviter. Restreindre aux admins ou à un rôle dédié est une bonne pratique de gouvernance.</li>
              <li><strong>Restrictions d'accès invité :</strong> limiter ce qu'un <code>Guest</code> peut lire de l'annuaire (le réglage le plus restrictif empêche l'énumération des autres objets).</li>
            </ul>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-cours-3">
            <h3>3. Paramètres d'accès inter-locataires</h3>
            <p>Les <strong>cross-tenant access settings (CTAS)</strong> remplacent la logique de trust AD par un réglage de confiance <strong>par organisation partenaire</strong>, orienté identité et non réseau.</p>
            <ul>
              <li><strong>Paramètres par défaut :</strong> la posture appliquée à tous les tenants non listés explicitement.</li>
              <li><strong>Paramètres organisationnels :</strong> une entrée par tenant partenaire (identifié par son Tenant ID ou son domaine), qui surcharge les défauts.</li>
            </ul>
            <p>Pour chaque partenaire, on règle trois axes :</p>
            <div class="table-wrapper">
              <table>
                <thead><tr><th>Axe</th><th>Ce qu'il contrôle</th></tr></thead>
                <tbody>
                  <tr><td><strong>Inbound access</strong></td><td>Les utilisateurs du partenaire autorisés à entrer chez vous en B2B, et sur quelles apps</td></tr>
                  <tr><td><strong>Outbound access</strong></td><td>Vos utilisateurs autorisés à être invités <strong>chez</strong> le partenaire</td></tr>
                  <tr><td><strong>Trust settings</strong></td><td>Accepter la <strong>MFA</strong>, l'<strong>appareil conforme</strong> ou <strong>hybrid joined</strong> déjà prouvés dans le tenant d'origine de l'invité</td></tr>
                </tbody>
              </table>
            </div>
            <p>Les <strong>trust settings</strong> sont la vraie nouveauté : sans eux, un invité déjà MFA chez lui devrait refaire une MFA chez vous (friction, parfois impossible). En faisant <strong>confiance à la MFA du tenant d'origine</strong>, votre Conditional Access considère l'exigence MFA satisfaite.</p>
            <aside class="callout callout--warning">
              <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
              <div class="callout__content">
                <span class="callout__label">PIÈGE FRÉQUENT</span>
                <p>Confondre <strong>B2B collaboration</strong> (l'invité obtient un objet <code>Guest</code> chez vous) et <strong>B2B direct connect</strong> (Teams shared channels : pas d'objet invité créé, l'accès est établi à la volée). Les deux se règlent dans les CTAS mais ne sont pas le même mécanisme.</p>
              </div>
            </aside>

            <div class="quickquestion animate-on-scroll" data-id="qq-trust-mfa">
              <div class="quickquestion__label"><svg width="14" height="14"><use href="#icon-sparkles"/></svg> Question rapide</div>
              <p class="quickquestion__question">Un consultant se plaint de devoir refaire une MFA chez vous alors qu'il en a déjà fait une chez lui. Que réglez-vous — <strong>et où</strong> ?</p>
              <button class="btn btn--soft-violet quickquestion__btn" type="button">Voir la réponse</button>
              <div class="quickquestion__answer">
                <strong>Activer Trust MFA dans les trust settings inbound du partenaire, pas dans les défauts globaux.</strong>
                <p class="quickquestion__explanation">Ajouter le tenant du partenaire en <em>organisation</em> dans les cross-tenant access settings, puis dans les trust settings inbound, cocher <strong>Trust MFA claims from external tenants</strong>. Ne jamais activer ça dans les défauts globaux : ce serait faire confiance à la MFA de <strong>n'importe quel</strong> tenant, y compris ceux que vous ne connaissez pas.</p>
              </div>
            </div>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-cours-4">
            <h3>4. Gouverner les accès invités (P2)</h3>
            <p>Inviter est facile ; le risque réel est le <strong>guest sprawl</strong> — des invités qui s'accumulent, gardent des accès après la fin d'un projet, et que personne ne revoit. La licence <strong>Entra ID P2</strong> apporte les outils de gouvernance :</p>
            <ul>
              <li><strong>Revues d'accès (Access Reviews)</strong> — campagne récurrente qui demande à un relecteur (le sponsor, le manager, ou l'invité lui-même) de confirmer si l'accès est encore justifié. Les accès non confirmés peuvent être <strong>retirés automatiquement</strong>. Cible privilégiée : « tous les invités d'un groupe / d'une app ».</li>
              <li><strong>Entitlement management (packages d'accès)</strong> — on empaquette des ressources (groupes, apps, sites) et on ouvre une <strong>demande en self-service</strong> aux externes d'organisations connectées, avec <strong>approbation</strong>, <strong>expiration</strong> automatique et politique de séparation des tâches. L'invité est provisionné à l'octroi et <strong>déprovisionné à l'expiration</strong>, cycle de vie compris.</li>
            </ul>
            <aside class="callout callout--info">
              <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--sky"><svg><use href="#icon-info"/></svg></div></div>
              <div class="callout__content">
                <span class="callout__label">PRINCIPE</span>
                <p>Préférer un <strong>package d'accès</strong> qui porte l'expiration dès le départ, plutôt qu'inviter à la main et « penser à retirer plus tard ». La discipline manuelle ne tient jamais sur la durée.</p>
              </div>
            </aside>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-cours-5">
            <h3>5. Entra External ID pour les clients (CIAM) — À CONNAÎTRE, NON DÉPLOYABLE EN L'ÉTAT</h3>
            <p><strong>Microsoft Entra External ID pour les clients</strong> (le nouveau <strong>CIAM</strong>, successeur d'Azure AD B2C) sert à exposer une <strong>application à ses clients / au grand public</strong> : inscription en self-service, pages de connexion <strong>personnalisées à la marque</strong>, <strong>user flows</strong>, fournisseurs d'identité sociaux (Google, Facebook, Apple), attributs personnalisés collectés à l'inscription.</p>
            <aside class="callout callout--info">
              <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--sky"><svg><use href="#icon-info"/></svg></div></div>
              <div class="callout__content">
                <span class="callout__label">HORS PÉRIMÈTRE DÉPLOYABLE</span>
                <p>Le CIAM repose sur un <strong>tenant « external » dédié</strong> et une facturation à l'usage au <strong>MAU (Monthly Active Users)</strong> rattachée à un abonnement Azure. Il <strong>n'est pas couvert par les licences workforce M365 E3 + Entra ID P2</strong>. On le traite <strong>en concept</strong> (vocabulaire, cas d'usage, différence avec le B2B), <strong>pas à déployer</strong> dans ce parcours.</p>
                <p><strong>Alternative E3+P2 :</strong> pour collaborer avec des <strong>partenaires et prestataires</strong>, la <strong>collaboration B2B</strong> (sections 1 à 4) couvre le besoin <strong>sans coût additionnel</strong>. Le CIAM ne se justifie que pour un scénario <strong>client / grand public</strong> — projet séparé, tenant external, budget MAU, hors du cadre E3+P2 de la PME.</p>
                <p><strong>À retenir :</strong> B2B = mes partenaires (déployable ici) ; CIAM = les clients de mon app (hors périmètre, facturé au MAU). Azure AD B2C, l'ancêtre du CIAM, reste disponible mais Microsoft oriente les nouveaux projets vers External ID : ne pas démarrer un nouveau B2C en 2026.</p>
              </div>
            </aside>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-cours-sources">
            <h3>Sources Microsoft Learn</h3>
            <ul>
              <li><a href="https://learn.microsoft.com/entra/external-id/external-identities-overview" target="_blank" rel="noopener">Vue d'ensemble External ID <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
              <li><a href="https://learn.microsoft.com/entra/external-id/what-is-b2b" target="_blank" rel="noopener">Collaboration B2B <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
              <li><a href="https://learn.microsoft.com/entra/external-id/user-properties" target="_blank" rel="noopener">Propriétés d'un utilisateur invité <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
              <li><a href="https://learn.microsoft.com/entra/external-id/cross-tenant-access-overview" target="_blank" rel="noopener">Paramètres d'accès inter-locataires <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
              <li><a href="https://learn.microsoft.com/entra/id-governance/access-reviews-overview" target="_blank" rel="noopener">Revues d'accès des invités <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
              <li><a href="https://learn.microsoft.com/entra/id-governance/entitlement-management-overview" target="_blank" rel="noopener">Entitlement management <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
              <li><a href="https://learn.microsoft.com/entra/external-id/customers/overview-customers-ciam" target="_blank" rel="noopener">External ID pour les clients (CIAM) <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
              <li><a href="https://learn.microsoft.com/entra/external-id/external-identities-pricing" target="_blank" rel="noopener">Facturation MAU External ID <svg width="12" height="12" style="display:inline"><use href="#icon-external-link"/></svg></a></li>
            </ul>
            <p class="text-muted" style="font-size:var(--fs-sm);margin-top:var(--space-3)"><em>Rappel : en cas d'écart entre ce support et le portail, le portail fait foi.</em></p>
          </div>
        </section>

        <!-- LAB -->
        <section class="module-section module-section--lab">
          <div class="section-header">
            <div class="icon-circle icon-circle--lg icon-circle--mint"><svg><use href="#icon-flask-conical"/></svg></div>
            <div class="section-header__content">
              <span class="section-header__label">LAB</span>
              <h2 class="section-header__title">Inviter, cadrer, gouverner</h2>
              <p class="section-header__meta">3 parties · TP guidé ~1h30 · Portail : entra.microsoft.com</p>
            </div>
          </div>

          <aside class="callout callout--license animate-on-scroll">
            <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--lavender"><svg><use href="#icon-key-round"/></svg></div></div>
            <div class="callout__content">
              <span class="callout__label">LICENCES REQUISES EN PRODUCTION</span>
              <p><strong>Collaboration B2B :</strong> incluse dès <strong>Entra ID Free</strong> (invitation, redémption, objet <code>Guest</code>).</p>
              <p><strong>Cross-tenant access settings :</strong> inclus dès Free (défauts + entrées organisationnelles + trust settings).</p>
              <p><strong>Gouvernance :</strong> revues d'accès + entitlement management = <strong>Entra ID P2</strong> (cible du projet).</p>
              <p><strong>External ID CIAM :</strong> hors E3+P2 — tenant external + facturation MAU.</p>
            </div>
          </aside>

          <div class="content-block animate-on-scroll" data-section-id="s-lab-a">
            <h3>Partie A — Inviter un consultant en B2B (30 min)</h3>
            <p><strong>Portail :</strong> <code>Entra admin center &gt; Users &gt; New user &gt; Invite external user</code>.</p>
            <ol>
              <li>Renseigner l'e-mail (ex : <code>consultant@partenaire.com</code>) et un message d'invitation.</li>
              <li>Vérifier dans la liste des utilisateurs : l'objet apparaît avec <code>userType = Guest</code>, UPN <code>consultant_partenaire.com#EXT#@votretenant.onmicrosoft.com</code>, état <code>PendingAcceptance</code>.</li>
              <li>Le consultant clique le lien d'invitation → authentification chez lui → consentement → état passe à <code>Accepted</code>.</li>
              <li>Assigner le <code>Guest</code> à un groupe M365 lié à un canal Teams projet.</li>
            </ol>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-lab-b">
            <h3>Partie B — Cadrer la confiance avec le tenant partenaire (30 min)</h3>
            <p><strong>Portail :</strong> <code>External Identities &gt; Cross-tenant access settings &gt; Organizational settings &gt; Add organization</code>.</p>
            <ol>
              <li>Saisir le domaine ou Tenant ID du partenaire (ex : <code>partenaire.com</code>).</li>
              <li><strong>Inbound access &gt; B2B collaboration :</strong> restreindre aux utilisateurs / apps nécessaires (pas <em>All users / All applications</em> par défaut).</li>
              <li><strong>Trust settings :</strong> cocher <strong>Trust MFA from Microsoft Entra tenants</strong> (et éventuellement <strong>Trust compliant devices</strong> si le partenaire est de confiance élevée).</li>
              <li>Ne <strong>pas</strong> activer Trust MFA dans les <em>Default settings</em> — uniquement par organisation.</li>
            </ol>
          </div>

          <div class="content-block animate-on-scroll" data-section-id="s-lab-c">
            <h3>Partie C — Provisionner via un package d'accès (30 min · P2)</h3>
            <p><strong>Portail :</strong> <code>Identity governance &gt; Entitlement management &gt; Access packages &gt; New access package</code>.</p>
            <ol>
              <li><strong>Catalog :</strong> créer un catalogue « Consultants externes ».</li>
              <li><strong>Resource roles :</strong> ajouter un groupe M365 (accès Teams / SharePoint projet) + une app si nécessaire.</li>
              <li><strong>Requests :</strong> autoriser <em>Users from other organizations</em>, cibler le tenant du partenaire (organisation connectée).</li>
              <li><strong>Approvers :</strong> un sponsor interne + un manager du partenaire (facultatif).</li>
              <li><strong>Lifecycle :</strong> <strong>expiration à 6 mois</strong> ; requêtes de renouvellement possibles.</li>
              <li><strong>Access reviews :</strong> revue tous les 3 mois, auto-apply ON.</li>
            </ol>
            <aside class="callout callout--info">
              <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--sky"><svg><use href="#icon-info"/></svg></div></div>
              <div class="callout__content">
                <span class="callout__label">RÉSULTAT ATTENDU</span>
                <ul style="margin:var(--space-2) 0 0">
                  <li>Un consultant partenaire est invité en B2B, redéemé, membre d'un groupe / canal Teams projet.</li>
                  <li>Le tenant partenaire est cadré en <em>Organizational settings</em> ; Trust MFA activé uniquement pour lui.</li>
                  <li>Un access package existe avec expiration 6 mois + revue trimestrielle + auto-apply.</li>
                  <li>Aucun compte membre « maison » n'a été créé.</li>
                </ul>
              </div>
            </aside>
          </div>
        </section>

        <!-- PIÈGES -->
        <section class="module-section module-section--pieges" data-section-id="s-pieges">
          <div class="section-header">
            <div class="icon-circle icon-circle--lg icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div>
            <div class="section-header__content">
              <span class="section-header__label">PIÈGES CLASSIQUES</span>
              <h2 class="section-header__title">5 pièges de collaboration externe</h2>
              <p class="section-header__meta">Lecture ~10 min</p>
            </div>
          </div>

          <aside class="callout callout--warning animate-on-scroll">
            <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
            <div class="callout__content">
              <span class="callout__label">PIÈGE 1 — CRÉER UN COMPTE « MAISON » AU PRESTATAIRE</span>
              <p><strong>Le réflexe :</strong> comme en AD, créer un compte membre au consultant externe, avec un mot de passe qu'on lui transmet.</p>
              <p><strong>Pourquoi c'est faux :</strong> on duplique une identité, on hérite de la gestion du mot de passe et de sa MFA, et l'accès ne se coupe pas quand le partenaire désactive la personne de son côté.</p>
              <p><strong>La bonne pratique :</strong> <strong>inviter</strong> l'externe en B2B (<code>Guest</code>). Son authentification reste chez lui ; sa désactivation dans son tenant coupe l'accès sans action de votre part.</p>
            </div>
          </aside>

          <aside class="callout callout--warning animate-on-scroll">
            <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
            <div class="callout__content">
              <span class="callout__label">PIÈGE 2 — CONFONDRE B2B ET EXTERNAL ID FOR CUSTOMERS (CIAM)</span>
              <p><strong>Le réflexe :</strong> vouloir gérer partenaires <strong>et</strong> clients grand public avec le même mécanisme d'invités.</p>
              <p><strong>Pourquoi c'est faux :</strong> le B2B (partenaires) est inclus dans les licences workforce ; le CIAM (clients d'une app) exige un <strong>tenant external</strong> dédié facturé au <strong>MAU</strong>, hors E3+P2. Mélanger les deux mène à un cul-de-sac de licence et d'architecture.</p>
              <p><strong>La bonne pratique :</strong> B2B pour les partenaires (déployable ici) ; réserver le CIAM aux scénarios grand public, comme un projet séparé avec son budget MAU.</p>
            </div>
          </aside>

          <aside class="callout callout--warning animate-on-scroll">
            <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
            <div class="callout__content">
              <span class="callout__label">PIÈGE 3 — ACTIVER « TRUST MFA » POUR TOUT LE MONDE</span>
              <p><strong>Le réflexe :</strong> cocher Trust MFA dans les paramètres par défaut pour supprimer les frictions de tous les invités.</p>
              <p><strong>Pourquoi c'est faux :</strong> faire confiance à la MFA de <strong>n'importe quel</strong> tenant revient à déléguer votre exigence d'authentification forte à des organisations que vous ne maîtrisez pas.</p>
              <p><strong>La bonne pratique :</strong> n'activer Trust MFA (et Trust compliant devices) que dans les <strong>paramètres organisationnels</strong> d'un partenaire <strong>réellement de confiance</strong>, pas dans les défauts globaux.</p>
            </div>
          </aside>

          <aside class="callout callout--warning animate-on-scroll">
            <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
            <div class="callout__content">
              <span class="callout__label">PIÈGE 4 — INVITER SANS JAMAIS REVOIR (GUEST SPRAWL)</span>
              <p><strong>Le réflexe :</strong> inviter au fil des projets et passer à autre chose.</p>
              <p><strong>Pourquoi c'est faux :</strong> les invités s'accumulent, gardent des accès après la fin des projets, et deviennent une surface d'attaque que personne ne surveille.</p>
              <p><strong>La bonne pratique :</strong> provisionner via un <strong>package d'accès</strong> à <strong>expiration</strong> (entitlement management) ou mettre en place des <strong>revues d'accès</strong> récurrentes ciblant les invités, avec retrait automatique (P2).</p>
            </div>
          </aside>

          <aside class="callout callout--warning animate-on-scroll">
            <div class="callout__icon"><div class="icon-circle icon-circle--sm icon-circle--peach"><svg><use href="#icon-alert-triangle"/></svg></div></div>
            <div class="callout__content">
              <span class="callout__label">PIÈGE 5 — LAISSER TOUT LE MONDE INVITER ET TOUT LIRE</span>
              <p><strong>Le réflexe :</strong> garder les réglages par défaut, où n'importe quel utilisateur (voire un invité) peut inviter, et où les invités lisent largement l'annuaire.</p>
              <p><strong>Pourquoi c'est faux :</strong> on perd la maîtrise de qui entre, et un invité peut énumérer utilisateurs, groupes et applications du tenant.</p>
              <p><strong>La bonne pratique :</strong> dans <strong>External collaboration settings</strong>, restreindre le droit d'inviter (admins ou rôle dédié) et appliquer la <strong>restriction d'accès invité</strong> la plus stricte compatible avec l'usage.</p>
            </div>
          </aside>
        </section>

        <!-- ÉVALUATION -->
        <section class="module-section module-section--eval" data-section-id="s-eval">
          <div class="section-header">
            <div class="icon-circle icon-circle--lg icon-circle--peach"><svg><use href="#icon-graduation-cap"/></svg></div>
            <div class="section-header__content">
              <span class="section-header__label">ÉVALUATION</span>
              <h2 class="section-header__title">Testez vos acquis</h2>
              <p class="section-header__meta">10 questions QCM · cas pratique · ~30 min</p>
            </div>
          </div>

          <div class="content-block animate-on-scroll" style="text-align:center;padding:var(--space-8)">
            <p style="font-size:var(--fs-lg);color:var(--text-secondary);margin-bottom:var(--space-3)">Une évaluation interactive qui vous donne le badge <strong>Acquis</strong> (≥60%) ou <strong>Maîtrisé</strong> (≥80%).</p>
            <div class="eval-status" style="max-width:400px;margin:0 auto var(--space-4)">Évaluation non tentée.</div>
            <button class="btn btn--primary btn--lg qcm-launcher" type="button">
              <svg width="18" height="18"><use href="#icon-sparkles"/></svg>
              Lancer l'évaluation
            </button>
          </div>

          <div class="caspratique animate-on-scroll" data-id="cp-10-cabinet-partenaire">
            <h3 class="caspratique__title">
              <svg width="24" height="24"><use href="#icon-graduation-cap"/></svg>
              Cas pratique — Cabinet partenaire + boutique en ligne
            </h3>
            <div class="caspratique__statement">
              <p><strong>Contexte :</strong> la PME (E3 + Entra ID P2) démarre un projet de 6 mois avec un cabinet partenaire. Un collègue propose :</p>
              <blockquote style="border-left:3px solid var(--violet-accent);padding-left:var(--space-3);color:var(--text-secondary);font-style:italic">« Je crée un compte à chaque consultant du cabinet dans notre tenant, avec un mot de passe qu'on leur envoie. Et pour notre future boutique en ligne grand public, on réutilisera ces mêmes comptes invités. »</blockquote>
              <p><strong>Questions :</strong></p>
              <ol>
                <li>Quel modèle utiliser pour les consultants du cabinet, et pourquoi les comptes « maison » sont-ils une mauvaise idée ?</li>
                <li>Comment cadrer la confiance avec le tenant du cabinet, et comment éviter une double MFA au consultant ?</li>
                <li>Comment garantir que les accès des consultants disparaissent à la fin des 6 mois ?</li>
                <li>La « boutique en ligne grand public » relève-t-elle du même mécanisme ? Que répondez-vous sur la licence ?</li>
              </ol>
            </div>
            <label class="caspratique__label" for="cp-textarea">Votre réponse :</label>
            <textarea id="cp-textarea" class="caspratique__textarea" placeholder="Rédigez votre démarche ici. Elle est sauvegardée automatiquement dans votre navigateur."></textarea>
            <div class="caspratique__actions">
              <button class="btn btn--soft-peach caspratique__reveal-btn" type="button">Voir la correction type</button>
              <button class="btn btn--ghost btn--sm caspratique__clear-btn" type="button">Effacer ma réponse</button>
            </div>
            <div class="caspratique__correction">
              <h4>Démarche attendue</h4>
              <ol>
                <li><strong>Collaboration B2B</strong> : inviter chaque consultant comme <code>Guest</code>. Les comptes « maison » sont une mauvaise idée car ils dupliquent des identités, imposent de gérer des mots de passe et leur rotation, et ne se coupent pas automatiquement quand le cabinet désactive le consultant chez lui.</li>
                <li><strong>Cross-tenant access settings</strong> : ajouter le tenant du cabinet en organisation partenaire, régler l'inbound sur les apps nécessaires, et activer <strong>Trust MFA</strong> (et éventuellement Trust compliant devices) dans les trust settings pour accepter la MFA déjà faite chez le cabinet, sans double challenge. Ne <strong>pas</strong> l'activer dans les défauts globaux.</li>
                <li><strong>Gouvernance P2</strong> : provisionner l'accès via un <strong>package d'accès</strong> (entitlement management) porteur d'une <strong>expiration</strong> à 6 mois, ou à défaut une <strong>revue d'accès</strong> récurrente ciblant les invités avec retrait automatique. L'accès disparaît sans geste manuel oublié.</li>
                <li><strong>Non</strong> : la boutique grand public relève du <strong>CIAM (External ID for customers)</strong>, un tenant external distinct facturé au <strong>MAU</strong> — pas du B2B et <strong>pas couvert par E3 + P2</strong>. C'est un projet séparé avec son propre budget ; on ne réutilise pas les objets <code>Guest</code> pour du grand public.</li>
              </ol>
              <h4>Grille d'auto-évaluation</h4>
              <ul class="caspratique__checklist">
                <li><input type="checkbox" id="cp-1"> <label for="cp-1">A refusé les <strong>comptes membres « maison »</strong> au profit du B2B</label></li>
                <li><input type="checkbox" id="cp-2"> <label for="cp-2">A expliqué que l'invité s'authentifie <strong>chez lui</strong></label></li>
                <li><input type="checkbox" id="cp-3"> <label for="cp-3">A configuré une entrée <strong>organisationnelle</strong> dans les CTAS pour le cabinet</label></li>
                <li><input type="checkbox" id="cp-4"> <label for="cp-4">A activé <strong>Trust MFA par organisation</strong>, pas dans les défauts globaux</label></li>
                <li><input type="checkbox" id="cp-5"> <label for="cp-5">A provisionné via un <strong>package d'accès</strong> à expiration ou une <strong>revue d'accès</strong> récurrente</label></li>
                <li><input type="checkbox" id="cp-6"> <label for="cp-6">A séparé la boutique grand public (CIAM) du B2B</label></li>
                <li><input type="checkbox" id="cp-7"> <label for="cp-7">A rappelé que le CIAM est <strong>hors E3 + P2</strong> (MAU + tenant external)</label></li>
              </ul>
            </div>
          </div>
        </section>
      </article>

      <aside class="module-sidebar-right" aria-label="Progression et sommaire">
        <div class="module-progress-card">
          <div class="module-progress-card__title">Ma progression</div>
          <div class="progress-donut progress-donut--module" data-value="0">
            <svg viewBox="0 0 120 120">
              <circle class="progress-donut__track" cx="60" cy="60" r="50"/>
              <circle class="progress-donut__fill" cx="60" cy="60" r="50" stroke-dasharray="314" stroke-dashoffset="314"/>
            </svg>
            <div class="progress-donut__label">
              <span class="progress-donut__value">0</span>
              <span class="progress-donut__unit">%</span>
            </div>
          </div>
          <div class="module-progress-card__stats">
            <div><strong class="module-progress-card__count">0 / 12</strong><br><span>sections lues</span></div>
          </div>
        </div>

        <nav class="module-toc" aria-label="Sommaire du module">
          <div class="module-toc__title">Sommaire</div>
          <ul class="module-toc__list">
            <li class="module-toc__item"><a class="module-toc__link" href="#s-objectifs" data-target="s-objectifs">Objectifs</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-cours-1" data-target="s-cours-1">1. B2B vs CIAM</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-cours-2" data-target="s-cours-2">2. Cycle de vie invité</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-cours-3" data-target="s-cours-3">3. Cross-tenant access</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-cours-4" data-target="s-cours-4">4. Gouverner les invités</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-cours-5" data-target="s-cours-5">5. CIAM (aperçu)</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-cours-sources" data-target="s-cours-sources">Sources</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-lab-a" data-target="s-lab-a">Lab · Invitation B2B</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-lab-b" data-target="s-lab-b">Lab · Cross-tenant</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-lab-c" data-target="s-lab-c">Lab · Package d'accès</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-pieges" data-target="s-pieges">Pièges classiques</a></li>
            <li class="module-toc__item"><a class="module-toc__link" href="#s-eval" data-target="s-eval">Évaluation</a></li>
          </ul>
        </nav>

        <div class="module-actions">
          <button class="btn btn--primary btn--full qcm-launcher" type="button">
            <svg width="16" height="16"><use href="#icon-sparkles"/></svg>
            Passer l'évaluation
          </button>
          <a class="btn btn--ghost btn--full" href="javascript:void(0)" onclick="if(window.ScormAPI){ScormAPI.terminate();}try{window.parent.location.reload();}catch(e){alert('Retournez sur Moodle pour le module suivant.');}return false;">
            <svg width="16" height="16"><use href="#icon-arrow-left"/></svg>
            Module précédent
          </a>
          <a class="btn btn--soft-violet btn--full" href="javascript:void(0)">
            <svg width="16" height="16"><use href="#icon-award"/></svg>
            Retour au dashboard
          </a>
        </div>
      </aside>
    </div>
  </main>

  <footer class="site-footer">
    <div class="site-footer__brand">
      <img src="assets/atoo-next-logo.svg" alt="Atoo Next">
      <span class="site-footer__tag">La connexion commence ici</span>
    </div>
    <div>Module 10 · Formation Microsoft Entra ID</div>
  </footer>

  <div class="modal-overlay" id="qcm-modal" role="dialog" aria-modal="true" aria-labelledby="qcm-modal-title">
    <div class="modal" tabindex="-1">
      <header class="modal__header">
        <h2 id="qcm-modal-title" style="margin:0;font-size:var(--fs-xl)">Évaluation — Collaboration B2B</h2>
        <button class="modal__close" aria-label="Fermer"><svg><use href="#icon-x"/></svg></button>
      </header>
      <div class="modal__body"></div>
      <footer class="modal__footer"></footer>
    </div>
  </div>

  <script>window.__SCORM_CONTEXT__ = true;</script>
  <script>
    window.MODULE_ID = '10-collaboration-externe-b2b';
    window.MODULE_NUM = '10';
    window.MODULE_STORAGE_KEY = 'formation-entra:module-10';
    window.MODULE_TITLE = 'Collaboration B2B';

    window.QCM_DATA = {
      module: '10-collaboration-externe-b2b',
      titre: 'Évaluation — Collaboration B2B',
      seuils: { acquis: 60, maitrise: 80 },
      questions: [
        { id: 'q1', type: 'single', enonce: 'Dans la collaboration B2B, où l\'invité prouve-t-il son identité ?', reference_cours: 'Section 2',
          choix: [
            { id: 'a', texte: 'Dans votre tenant, contre votre annuaire', correct: false, feedback_si_choisi: 'Ce serait un compte membre « maison », l\'anti-pattern principal du B2B.' },
            { id: 'b', texte: 'Dans son tenant d\'origine (ou via un code e-mail à usage unique en repli)', correct: true },
            { id: 'c', texte: 'Sur un contrôleur de domaine on-prem que vous exposez', correct: false, feedback_si_choisi: 'On n\'expose jamais un DC. Le B2B est purement cloud, sans lien réseau.' },
            { id: 'd', texte: 'Nulle part, l\'accès est anonyme', correct: false, feedback_si_choisi: 'L\'accès est authentifié — le B2B ne fait rien d\'anonyme.' }
          ],
          explication: 'L\'invité s\'authentifie chez lui (home realm) ; l\'OTP e-mail n\'est qu\'un repli pour un externe sans identité fédérable. Vous ne gérez ni son mot de passe ni sa MFA.'
        },
        { id: 'q2', type: 'single', enonce: 'Quel attribut caractérise un utilisateur invité et sert de filtre partout ?', reference_cours: 'Section 2',
          choix: [
            { id: 'a', texte: '`userType = Member`', correct: false, feedback_si_choisi: 'Member désigne un utilisateur interne du tenant, pas un invité.' },
            { id: 'b', texte: '`userType = Guest`', correct: true },
            { id: 'c', texte: '`accountEnabled = false`', correct: false, feedback_si_choisi: 'Cet attribut désigne un compte désactivé, aucun rapport avec le caractère externe.' },
            { id: 'd', texte: '`onPremisesSyncEnabled = true`', correct: false, feedback_si_choisi: 'Cet attribut désigne un compte synchronisé depuis l\'AD (module 03), pas un invité B2B.' }
          ],
          explication: 'userType = Guest pilote les restrictions et sert de filtre dans CA, les revues d\'accès, l\'entitlement management. C\'est l\'attribut discriminant du B2B.'
        },
        { id: 'q3', type: 'single', enonce: 'Un invité vient d\'être créé mais n\'a pas cliqué le lien d\'invitation. Son état est :', reference_cours: 'Section 2',
          choix: [
            { id: 'a', texte: '`Accepted`', correct: false, feedback_si_choisi: 'Accepted vient après le consentement — pas avant.' },
            { id: 'b', texte: '`PendingAcceptance`', correct: true },
            { id: 'c', texte: '`Deleted`', correct: false, feedback_si_choisi: 'Ce n\'est pas un état d\'invitation — c\'est un objet supprimé.' },
            { id: 'd', texte: '`Disabled`', correct: false, feedback_si_choisi: 'Disabled décrit un compte désactivé, pas un invité en attente.' }
          ],
          explication: 'Avant rédemption : PendingAcceptance. L\'objet Guest existe déjà dans votre tenant mais n\'a pas d\'accès effectif. Après consentement de l\'invité : Accepted.'
        },
        { id: 'q4', type: 'single', enonce: 'Les **cross-tenant access settings** permettent, entre autres, de :', reference_cours: 'Section 3',
          choix: [
            { id: 'a', texte: 'Ouvrir un tunnel réseau permanent vers le partenaire', correct: false, feedback_si_choisi: 'C\'est la logique d\'un trust AD, pas des CTAS — le B2B ne concerne pas le réseau.' },
            { id: 'b', texte: 'Faire **confiance à la MFA / à l\'appareil conforme** déjà prouvés dans le tenant d\'origine de l\'invité', correct: true },
            { id: 'c', texte: 'Réinitialiser le mot de passe des invités', correct: false, feedback_si_choisi: 'Vous ne gérez pas l\'auth de l\'invité — impossible de réinitialiser son mot de passe.' },
            { id: 'd', texte: 'Synchroniser l\'AD local du partenaire', correct: false, feedback_si_choisi: 'La synchronisation d\'AD (module 03) n\'a rien à voir avec les CTAS.' }
          ],
          explication: 'Les trust settings dans les CTAS acceptent MFA / appareil conforme prouvés dans le tenant d\'origine, évitant le double challenge. À activer par organisation, pas dans les défauts globaux.'
        },
        { id: 'q5', type: 'single', enonce: 'Quelle affirmation distingue correctement B2B et CIAM (External ID for customers) ?', reference_cours: 'Section 1 + Section 5',
          choix: [
            { id: 'a', texte: 'B2B vise les clients grand public, CIAM vise les partenaires', correct: false, feedback_si_choisi: 'Publics inversés — c\'est exactement l\'inverse.' },
            { id: 'b', texte: 'B2B vise les partenaires / prestataires (inclus dans les licences workforce) ; CIAM vise les clients d\'une app (tenant external dédié, facturé au MAU)', correct: true },
            { id: 'c', texte: 'Les deux sont facturés au MAU', correct: false, feedback_si_choisi: 'Le B2B est inclus dans les licences workforce ; seul le CIAM est au MAU.' },
            { id: 'd', texte: 'Les deux nécessitent un trust de forêt AD', correct: false, feedback_si_choisi: 'Aucun des deux ne nécessite de trust AD — le B2B est cloud pur.' }
          ],
          explication: 'B2B = mes partenaires (workforce, inclus) ; CIAM = les clients de mon app (tenant external, facturé MAU, hors E3+P2). Deux mécanismes différents pour des publics différents.'
        },
        { id: 'q6', type: 'single', enonce: 'Sur quel modèle l\'External ID pour les clients (CIAM) est-il facturé ?', reference_cours: 'Section 5',
          choix: [
            { id: 'a', texte: 'Par utilisateur nommé, comme E3', correct: false, feedback_si_choisi: 'Ce n\'est pas un modèle par utilisateur nommé — c\'est à l\'usage.' },
            { id: 'b', texte: 'Au **MAU (Monthly Active Users)**, via un abonnement Azure', correct: true },
            { id: 'c', texte: 'Gratuit et illimité', correct: false, feedback_si_choisi: 'Seul un palier gratuit limité existe — au-delà, c\'est facturé au MAU.' },
            { id: 'd', texte: 'Au contrôleur de domaine', correct: false, feedback_si_choisi: 'Aucun rapport — le CIAM est cloud, pas de DC.' }
          ],
          explication: 'MAU = utilisateur actif au moins une fois dans le mois. Modèle Azure classique pour les services grand public, adapté à la volumétrie variable d\'une base clients.'
        },
        { id: 'q7', type: 'multi', enonce: 'Quelles fonctionnalités de gouvernance des invités relèvent d\'**Entra ID P2** ? (plusieurs)', reference_cours: 'Section 4',
          choix: [
            { id: 'a', texte: 'Les revues d\'accès (Access Reviews)', correct: true },
            { id: 'b', texte: 'Les packages d\'accès (entitlement management)', correct: true },
            { id: 'c', texte: 'L\'invitation B2B de base', correct: false, feedback_si_choisi: 'L\'invitation B2B de base est incluse dès Entra ID Free — pas besoin de P2.' },
            { id: 'd', texte: 'La suppression manuelle d\'un compte', correct: false, feedback_si_choisi: 'La suppression manuelle est une opération de base, pas une fonction P2.' }
          ],
          explication: 'Revues d\'accès + Entitlement management = Entra ID Governance = Entra ID P2. Ces briques transforment la simple invitation en gouvernance industrialisée (approbation, expiration, retrait auto).'
        },
        { id: 'q8', type: 'single', enonce: 'Un invité doit refaire une MFA chez vous alors qu\'il en a déjà fait une chez lui. Que règle-t-on ?', reference_cours: 'Section 3',
          choix: [
            { id: 'a', texte: 'On désactive le Conditional Access', correct: false, feedback_si_choisi: 'Désactiver le CA supprime toute votre stratégie de sécurité — jamais la solution.' },
            { id: 'b', texte: 'On active **Trust MFA** dans les trust settings entrants du partenaire (cross-tenant access)', correct: true },
            { id: 'c', texte: 'On lui crée un compte membre', correct: false, feedback_si_choisi: 'C\'est l\'anti-pattern principal du B2B — le compte « maison ».' },
            { id: 'd', texte: 'On passe le tenant en E5', correct: false, feedback_si_choisi: 'E5 n\'est pas en cause — le réglage se fait dans les CTAS, disponibles dès Free.' }
          ],
          explication: 'Trust MFA dans les trust settings inbound de l\'organisation partenaire : votre CA considère l\'exigence MFA satisfaite si l\'invité a déjà fait sa MFA chez lui. À activer par partenaire, jamais dans les défauts globaux.'
        },
        { id: 'q9', type: 'single', enonce: 'Pourquoi éviter de créer un compte **membre** « maison » pour un prestataire externe ?', reference_cours: 'Section 1 + Piège 1',
          choix: [
            { id: 'a', texte: 'C\'est interdit techniquement', correct: false, feedback_si_choisi: 'C\'est techniquement possible — mais fonctionnellement une mauvaise pratique.' },
            { id: 'b', texte: 'On multiplie les identités à gérer et les secrets à faire tourner, alors que l\'invitation B2B laisse l\'identité chez le partenaire', correct: true },
            { id: 'c', texte: 'Un membre coûte plus cher qu\'un invité au MAU', correct: false, feedback_si_choisi: 'Confusion : le MAU concerne le CIAM, pas les invités B2B.' },
            { id: 'd', texte: 'Un membre ne peut pas ouvrir Teams', correct: false, feedback_si_choisi: 'Un membre peut ouvrir Teams — ce n\'est pas la raison.' }
          ],
          explication: 'Compte « maison » = duplication d\'identité + mot de passe à gérer + rotation à assurer + coupure manuelle à ne pas oublier quand le prestataire part. Le B2B élimine tout ça.'
        },
        { id: 'q10', type: 'single', enonce: 'Pour éviter le **guest sprawl** (invités qui s\'accumulent), la meilleure approche est :', reference_cours: 'Section 4 + Piège 4',
          choix: [
            { id: 'a', texte: 'Interdire toute invitation', correct: false, feedback_si_choisi: 'Interdire casse la collaboration légitime — trop brutal.' },
            { id: 'b', texte: 'Des revues d\'accès récurrentes et des packages d\'accès à **expiration** automatique (P2)', correct: true },
            { id: 'c', texte: 'Supprimer tous les invités chaque mois à la main', correct: false, feedback_si_choisi: 'Ne passe pas à l\'échelle — repose sur une discipline manuelle qui échoue.' },
            { id: 'd', texte: 'Passer au CIAM', correct: false, feedback_si_choisi: 'Le CIAM répond à un autre besoin (clients grand public) — pas à la gouvernance des invités partenaires.' }
          ],
          explication: 'Revues récurrentes + packages à expiration = P2 : le sprawl est traité à la racine, sans dépendre d\'un geste manuel oublié. Le lifecycle est industrialisé.'
        }
      ]
    };
  </script>
  <script src="assets/shared.js"></script>

  <script src="scorm2004-api.js"></script>
  <script src="scorm-bridge.js"></script>
</body>
</html>
