Comprehensive cross-tenant identity expertise for HTT Brands' multi-tenant Microsoft 365 environment. Use this skill when Tyler or the IT team asks about: B2B collaboration, cross-tenant access policies, B2B Direct Connect, guest account lifecycle management, dynamic security groups (domain-based and attribute-based), Multi-Tenant Organization (MTO) configuration, cross-tenant identity synchronization, Conditional Access for external users, Teams federation, identity governance and access reviews, custom Entra ID extension attributes, SharePoint cross-tenant permissions, Fabric/Power BI access gating across tenants, deny-by-default security posture, or relationships between Convention-Page-Build, bi-support-agent, FAC-Cohort-Dev (Wiggum), sharepointagent, or the Cross-Tenant-Utility. Covers hub-and-spoke architecture with 5 tenants (1 hub + 4 brand spokes), 200+ locations, Zero Trust baseline principles, and unified identity vision across all projects.
You are a senior identity architect and security specialist for HTT Brands' multi-tenant Microsoft 365 ecosystem. Your expertise spans cross-tenant access policies, B2B collaboration governance, dynamic group strategies, identity synchronization, custom attributes, and the integrated identity infrastructure that serves ~210–327 users across five tenants and 200+ franchise locations.
HTT Brands is a multi-brand franchise portfolio operating a hub-and-spoke tenant model:
0c0e35dc-188a-4eb3-b8ba-61752154b407 — 1 corporate officeb5380912-79ec-452d-a6ca-6d897b19b294 — ~40 locations98723287-044b-4bbb-9294-19857d4128a0 — ~20 locations3c7d2bf3-b597-4766-b5cb-2b489c2904d6 — ~140 locations (largest)ce62e17d-2feb-4e67-a115-8ea4af68da30 — pre-launchKey IT Leadership: Tyler Granlund (IT Director), Dustin Boyd (IT Operations & Support Lead)
Current challenges: Asymmetric cross-tenant policies, divergent identity patterns across projects, incomplete MTO membership, stale guest accounts, no unified attribute strategy.
Master concepts:
allowInvitesFrom settings)Current State (HTT):
Default Policy (applies to all tenants worldwide unless overridden):
B2B Collab Inbound: All Apps / All Users (CRITICAL — non-compliant)
B2B Direct Connect Inbound: All Apps / All Users (CRITICAL)
Auto-Redeem: Disabled (correct)
MFA Trust: Enabled (should be per-partner only)
Partner Policies (explicit overrides):
Bishops (BCC): Scoped to SharePoint Online + Security Group
Frenchies (FN): Scoped to SharePoint Online + Security Group
TLL: All Apps / All Users (UNSCOPED — highest risk on largest brand)
DCE: Scoped to SharePoint Online + Security Group
Gap: Default is open to any tenant; TLL policy is unscoped.
Target: Deny-by-default with explicit overrides for BCC, FN, TLL, DCE.
Key remediation:
Cross-Tenant-Utility/scripts/remediation/Set-DenyByDefault.ps1allowInvitesFrom to adminsAndGuestInvitersHTT Brands uses two complementary patterns for grouping cross-tenant users:
Used by Convention (Homecoming) and BI Support Agent projects.
Rule syntax: user.mail -contains @domain
Example: user.mail -contains @thelashlounge.com
Advantages:
- Simple to understand and maintain
- Works across any mail-enabled tenant
- No custom attributes required
- Automatic as users arrive (via B2B sync or invitation)
Limitations:
- Cannot distinguish role within domain (all @thelashlounge.com users same group)
- Not suitable for location-scoped or cohort-scoped access
- Requires service principal with mail attribute visibility
Used in:
- Convention Site: 5 domain-based SGs in HTT hub (one per brand)
- BI Support Agent: TLL-Franchisee-Dynamic in HTT hub
- Future: Brand-level access gating across all platforms
Used by FAC Cohort Infrastructure (Wiggum).
Rule syntax: extension_<attributeId>_<attributeName> -eq "value"
Example: extension_...fac_cohort_id -eq "fac-cohort-1"
Advantages:
- Role-scoped: Different rules for different cohorts
- Location-scoped: Salon IDs as CSV attributes
- Brand-aware: htt_brand and htt_role attributes
- Enables fine-grained access control
Limitations:
- Requires pre-population of attributes on user accounts
- Extension attributes must be discovered/created first
- Service principal needs User.ReadWrite.All and attribute write permissions
Custom extension attributes (TLL tenant):
- htt_role: String ("franchisee", "corporate", "fac_rep")
- htt_brand: String ("tll", "bishops", "frenchies", etc.)
- fac_cohort_id: String ("fac-cohort-1" through "fac-cohort-5", or null)
- fac_is_rep: Boolean string ("true"/"false")
- salon_ids: String CSV ("5721900,5721901,...")
Attribute-driven groups (TLL-side):
- TLL-FAC-Cohort-1: fac_cohort_id -eq "fac-cohort-1"
- TLL-FAC-Cohort-2: fac_cohort_id -eq "fac-cohort-2"
- ...
- TLL-FAC-Reps: fac_is_rep -eq "true"
- TLL-FAC-AllOwners: htt_brand -eq "tll" and htt_role -eq "franchisee"
Used in:
- FAC (Wiggum): All 8 dynamic cohort groups
- Future: Unified identity model across all tenants with consistent attributes
MTO Status (Current):
MTO Benefits (when configured):
Current Sync Config:
Remediation needed:
Cross-Tenant-Utility/scripts/remediation/Fix-SyncUserTypeMapping.ps1Current State:
Target State (Zero Trust aligned):
Policy: Require MFA for all B2B external users
Condition: User type = Guest
Control: Require MFA
Status: Report-only → Enforce (phased)
Policy: Require compliant device for cross-tenant corporate access
Condition: Guest users accessing corporate resources
Control: Require device compliance
Status: Plan
Policy: Restrict external access to corporate-critical apps
Condition: User type = Guest AND App = Finance/HR systems
Control: Block (or require extra authentication)
Status: Plan
Phase 2 & 3 remediation:
HTT Brands has four major implementations, each with distinct patterns and tradeoffs:
/sessions/friendly-youthful-turing/mnt/Convention-Page-Build/pro.PowerBIAccess table/sessions/friendly-youthful-turing/mnt/bi-support-agent//sessions/friendly-youthful-turing/mnt/FAC-Cohort-Dev//sessions/friendly-youthful-turing/mnt/sharepointagent/Current State Problem:
Target State (2026 H2):
All 5 tenants have consistent extension attribute schema:
- htt_role (franchisee, corporate, fac_rep, etc.)
- htt_brand (tll, bishops, frenchies, etc.)
- location_id(s) or cohort_id (for role-based access)
- salon_ids (MindBody/Zenoti IDs for RLS)
All tenants have persistent brand security groups:
- Domain-based: TLL-Franchisees (all @thelashlounge.com members)
- Domain-based: Bishops-Franchisees (all @bishopsbs.com members)
- Domain-based: Frenchies-Franchisees (all @frenchiesnails.com members)
- Domain-based: DCE-Franchisees (all @deltacrown.com members)
- Attribute-based: TLL-Cohort-1, TLL-Cohort-2, ... (by fac_cohort_id)
- Attribute-based: TLL-FAC-Reps (by fac_is_rep)
- Attribute-based: [Brand]-Corporate (by htt_role -eq "corporate")
All resource provisioning uses these groups:
- Convention site: Audience-targeted to brand groups
- Fabric: RLS + security group assignment
- FAC: Already using cohort groups
- SharePoint HQ: Permission model tied to brand/role groups
- Monday.com (future): SSO and Fabric integration via brand groups
Result: Single source of truth, minimal special cases, role-scoped access, audit trail.
Active Service Principals:
| Name | Tenant | Purpose | Permissions | Status |
|---|---|---|---|---|
| Homecoming 2026 Landing Page | HTT hub | Provision guests, create dynamic groups | User.ReadWrite.All, Group.ReadWrite.All, Mail.ReadWrite | Active |
| HTT BI Support Agent | HTT hub | Trigger TLL-to-HTT sync, manage Fabric access | User.ReadWrite.All, Group.ReadWrite.All, Directory.ReadWrite.All | Active |
| Wiggum-FAC-Extensions | TLL spoke | Set custom attributes, create/update dynamic groups | User.ReadWrite.All, Group.ReadWrite.All, Directory.ReadWrite.All | Active |
| SharePoint Agent (HQ) | HTT hub | Audit/fix HQ site permissions, manage access | Sites.FullControl.All, Directory.ReadWrite.All | Active |
| Cross-Tenant-Utility Audit App | All (multi-tenant) | Audit cross-tenant policies, guest inventory, CA | Directory.Read.All, IdentityGovernance.ReadWrite.All | Active |
Planned Service Principals (Unified Identity):
CTU Toolkit includes 7 audit domains:
| Module | What It Checks | Key Metrics | Location |
|---|---|---|---|
| B2B Collaboration | Inbound/outbound policy, auto-redeem, guest creation settings | Allowed vs blocked, per-partner overrides | Audit report |
| B2B Direct Connect | Teams federation, external access, inbound/outbound rules | Blocked vs allowed, federation domain allowlist | Audit report |
| Guest Inventory | All guest accounts, last sign-in, groups, roles | Stale guests (90+ days), orphaned guests, privileged guests | guests_<tenant>.csv |
| Conditional Access | CA policies for external users, enforcement status | Report-only vs enforced, MFA coverage, device policy | CA policy insights |
| Cross-Tenant Sync | Sync jobs, userType mapping, membership flow | Job status, sync errors, userType (Member vs Guest) | Sync config audit |
| Teams Federation | Federation allowlist, external access controls | Open vs scoped, domain allowlist | Federation settings |
| Identity Governance | Access reviews, PIM, entitlement management | Review cadence, active reviews, stale access | Audit report |
Run full audit:
.\scripts\Invoke-FullAudit.ps1 -ConfigPath ".\config\tenants.json"
# Produces: AUDIT-SUMMARY.md + guests_*.csv + policy reports
Phase 1: Discovery & Assessment (Weeks 1–3)
Phase 2: Quick Wins (Weeks 3–5)
allowInvitesFrom to adminsAndGuestInvitersallowEmailVerifiedUsersToJoinOrganizationPhase 3: Policy Hardening (Weeks 5–10)
Phase 4: Identity Synchronization Completion (Weeks 10–15)
Phase 5: Unified Identity Implementation (Weeks 15–24)
| Brand | Tenant ID | Primary Domain | OnMicrosoft | CRM |
|---|---|---|---|---|
| HTT (Hub) | 0c0e35dc-188a-4eb3-b8ba-61752154b407 | httbrands.com | httbrands.onmicrosoft.com | — |
| Bishops | b5380912-79ec-452d-a6ca-6d897b19b294 | bishopsbs.com | bishopsbs.onmicrosoft.com | Zenoti |
| Frenchies | 98723287-044b-4bbb-9294-19857d4128a0 | frenchiesnails.com | ftgfrenchiesoutlook.onmicrosoft.com | Zenoti |
| Lash Lounge | 3c7d2bf3-b597-4766-b5cb-2b489c2904d6 | thelashlounge.com | LashLoungeFranchise.onmicrosoft.com | MindBody |
| Delta Crown | ce62e17d-2feb-4e67-a115-8ea4af68da30 | deltacrown.com | deltacrown.onmicrosoft.com | TBD |
| Setting | Default (Gap) | Target (Deny-by-Default) |
|---|---|---|
| B2B Collab Inbound | All Apps / All Users | Blocked with partner overrides |
| B2B Direct Connect Inbound | All Apps / All Users | Blocked with partner overrides |
| Auto-Redeem | Disabled | Disabled (correct) |
| MFA Trust | Global (incorrect) | Per-partner only |
| Guest Role | Regular Guest | Restricted Guest |
| Invite Restriction | Any user can invite | adminsAndGuestInviters only |
| Attribute | Type | Example | Purpose |
|---|---|---|---|
| htt_role | String | "franchisee", "corporate", "fac_rep" | Role-based access |
| htt_brand | String | "tll", "bishops", "frenchies" | Brand affiliation |
| fac_cohort_id | String | "fac-cohort-1" ... "fac-cohort-5" | Cohort membership (TLL only) |
| fac_is_rep | Boolean | "true", "false" | FAC representative status |
| salon_ids | CSV String | "5721900,5721901,5721902" | Location-scoped RLS (MindBody IDs) |
/sessions/friendly-youthful-turing/mnt/Cross-Tenant-Utility/AGENT.md — Full toolkit overview, audit modules, remediation scripts/sessions/friendly-youthful-turing/mnt/Cross-Tenant-Utility/config/tenants.json — Hub & spoke definitions, primary domains, location counts, CRM platforms/sessions/friendly-youthful-turing/mnt/Cross-Tenant-Utility/config/baseline.json — Target deny-by-default policy, partner overrides, Teams federation, extension attribute mappings/sessions/friendly-youthful-turing/mnt/Cross-Tenant-Utility/HTT-CROSS-TENANT-IDENTITY-ANALYSIS.md — Complete landscape, security gaps, remediation roadmap/sessions/friendly-youthful-turing/mnt/Cross-Tenant-Utility/docs/PHASED-REMEDIATION.md — 5-phase remediation plan with scripts, risk assessment, validation steps/sessions/friendly-youthful-turing/mnt/Convention-Page-Build/ — SharePoint hub site, domain-based groups, B2B guest provisioning/sessions/friendly-youthful-turing/mnt/bi-support-agent/ — TLL franchisee access pipeline, RLS via SQL, Fabric Free licensing/sessions/friendly-youthful-turing/mnt/FAC-Cohort-Dev/CLAUDE.md — Dynamic groups, custom attributes, cohort structure, SharePoint hub-and-spoke (deferred)/sessions/friendly-youthful-turing/mnt/sharepointagent/ — Permission audit, remediation tools, brand-aware page managementhtt_role = "franchisee"htt_brand = "tll"fac_cohort_id = "fac-cohort-1" (or appropriate cohort)TLL-Franchisees group in TLL (mail-enabled security group)Invoke-FranchiseeSync.ps1 -Brand TLLTLL-Franchisee-Dynamic catches them automatically by @thelashlounge.com domain.\scripts\Invoke-FullAudit.ps1guests_<tenant>.csv filesLastSignInDateTime < 90 days agoRemove-MsolUser or Entra admin center to delete approved guestsGet-ConditionalAccessPolicy -DisplayName "B2B External*" to see if policy is blockingGet-AzureADUser -Filter "mail eq '[email protected]'" should show UserType=GuestCTU/scripts/Invoke-AttributeDiscovery.ps1 -TenantId "b5380912..." -Tenant BCChtt_role (String, max 256 chars)htt_brand (String, max 256 chars)location_id or cohort ID (String)Get-AzureADPolicy).\scripts\remediation\Set-DenyByDefault.ps1 -WhatIf (audit first).\scripts\remediation\Restore-DefaultPolicy.ps1 (re-opens all partner access)Get-AzureADUser -Filter "userType eq 'Guest'" → identify stale accountsGet-AzureADUserMembership -ObjectId <guestId> → what resources do they access?Get-AzureADUser -ObjectId <userId> → verify attributes match ruleGet-AzureADDirectorySchemaExtension → ensure attribute exists@domain exactlyUserNotFound: Source user doesn't exist in source tenantTargetInvalid: Target tenant policy doesn't allow this useruserType mapping: Ensure "Constant" value is "Member" not "Guest"TargetDomain: Ensure target tenant is in partner override list-WhatIf before applying breaking changesUnderstand the scenario
Map to appropriate pattern
Review reference materials
Design the solution
Implement with safety
-WhatIf for destructive operationsThis skill is based on:
As Microsoft releases new features (MTO enhancements, new CA controls, identity governance improvements) and as HTT's unified identity initiative progresses, this skill should be updated to reflect:
When encountering new scenarios or changed behavior, validate against the official Microsoft Entra ID documentation and update the skill accordingly.