You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A hands-on Microsoft Entra ID portfolio project modeling two NBA franchises' full identity infrastructure — dynamic group membership, automated lifecycle management, cross-team trade workflows, conditional access policies, and privileged identity management.
Overview
Professional sports organizations have unusually demanding IAM requirements. Rosters change constantly, staff roles carry strict data access boundaries (HIPAA for medical staff, financial controls for front office), and access must be provisioned and revoked rapidly when players are drafted, traded, injured, or released.
This lab models that environment end-to-end using Microsoft Entra ID, PowerShell, Microsoft Graph API, and Bicep — across two real NBA franchises operating as separate organizational units inside a single tenant.
Architecture
Entra ID Tenant — NBA League
│
├── OKC Thunder
│ ├── OKC-Players-ActiveRoster ← extensionAttribute1="active" + extensionAttribute3="OKC"
│ ├── OKC-Players-InjuredReserve ← extensionAttribute1="injuredReserve" + extensionAttribute3="OKC"
│ ├── OKC-Players-Offboarded ← extensionAttribute1="released"/"traded" + extensionAttribute3="OKC"
│ ├── OKC-Staff-Medical ← department="Medical" + extensionAttribute3="OKC"
│ ├── OKC-Staff-Coaching ← department="Coaching" + extensionAttribute3="OKC"
│ └── OKC-FrontOffice ← department="FrontOffice" + extensionAttribute3="OKC"
│
├── New York Knicks
│ ├── NYK-Players-ActiveRoster ← extensionAttribute1="active" + extensionAttribute3="NYK"
│ ├── NYK-Players-InjuredReserve ← extensionAttribute1="injuredReserve" + extensionAttribute3="NYK"
│ ├── NYK-Players-Offboarded ← extensionAttribute1="released"/"traded" + extensionAttribute3="NYK"
│ ├── NYK-Staff-Medical ← department="Medical" + extensionAttribute3="NYK"
│ ├── NYK-Staff-Coaching ← department="Coaching" + extensionAttribute3="NYK"
│ └── NYK-FrontOffice ← department="FrontOffice" + extensionAttribute3="NYK"
│
├── League-Wide Groups
│ ├── NBA-AllPlayers-ActiveRoster ← all active players, both teams
│ └── NBA-Scouting-ReadAccess ← coaches + front office cross-team scouting access
│
├── Conditional Access Policies
│ ├── CAP-Players-MFA-CompliantDevice ← all active roster players, both teams
│ ├── CAP-OKC-Executives-LocationRestricted ← Paycom Center IP range
│ └── CAP-NYK-Executives-LocationRestricted ← Madison Square Garden IP range
│
├── Privileged Identity Management
│ └── PIM-MedicalStaff-PatientData ← JIT, 2hr window, justification required
│
└── Lifecycle Automation
├── New-PlayerOnboarding.ps1
├── Invoke-PlayerRelease.ps1
├── Invoke-PlayerTrade.ps1
└── Invoke-RosterStatusUpdate.ps1
# Install and connectInstall-Module Microsoft.Graph -Scope CurrentUser
Connect-MgGraph-Scopes "User.ReadWrite.All","Group.ReadWrite.All","Policy.ReadWrite.ConditionalAccess","RoleManagement.ReadWrite.Directory"# Deploy base infrastructure
az group create --name rg-nba-iam-lab --location eastus
az deployment group create --resource-group rg-nba-iam-lab --template-file bicep/main.bicep
# Onboard a player
./powershell/New-PlayerOnboarding.ps1-DisplayName "Shai Gilgeous-Alexander"-Position "PG"-JerseyNumber "2"-TeamCode "OKC"# Execute a trade
./powershell/Invoke-PlayerTrade.ps1-PlayerUPN "player@nba-lab.com"-FromTeam "OKC"-ToTeam "NYK"
Skills Demonstrated
Skill
Implementation
Entra ID Administration
Multi-team user lifecycle, compound extension attributes, license management
Dynamic Group Membership
Team-scoped compound rules, league-wide group layer, automatic recalculation