The PIMActivation Portal is built around two non-negotiables: 1. **No backend.** Every privileged call goes from your browser directly to Microsoft Graph or Azure Resource Manager. 2. **Tokens never leave your browser, and they don't survive the tab.** MSAL.js caches them in `sessionStorage` only. This page lays out what that means in practice, what the threat model is, and what mitigations are in place. ## Data flow ```text ┌──────────────────────────────┐ │ Your browser │ │ │ │ Portal SPA ──────────────► login.microsoftonline.com (auth) │ ──────────────► graph.microsoft.com (Entra + Group PIM) │ ──────────────► management.azure.com (Azure Resource PIM) └──────────────────────────────┘ ``` There is **no other arrow**. No telemetry, no analytics, no third-party APIs. The Content Security Policy enforces that. ## Content Security Policy `Portal/staticwebapp.config.json` sets: ```text default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; connect-src 'self' https://login.microsoftonline.com https://graph.microsoft.com https://management.azure.com; img-src 'self' data:; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'; upgrade-insecure-requests ``` What this gives you: - **No inline scripts and no `eval`.** Any `