User Management
Audience: Administrators, Platform Engineers
Time: ~15 min
Prerequisites: Control Core Control Plane deployed and accessible, Super Administrator (ccadmin) credentials
This guide covers creating and managing users, role definitions and permissions, SSO configuration, passkeys, MFA, authentication methods, and session management within the Control Core Control Plane.
Overview
The User Management page (Settings → Users) provides centralized administration for:
- Users — create, edit, deactivate, and audit user accounts
- SSO — configure enterprise identity providers (Entra, Okta, Google Workspace, Auth0, PingID, Generic OIDC, SAML)
- MFA — enforce multi-factor authentication across the organization
- Passkeys — manage WebAuthn/FIDO2 passwordless credentials
- Authentication Methods — control which login methods are available
Accessing User Management
- Log in to the Control Core Control Plane as a Super Administrator
- Navigate to Settings → Users
- Select the appropriate tab for the area you want to configure
Role Definitions
Control Core uses role-based access control aligned with the principle of least privilege. Each user is assigned exactly one role that determines their permissions across the platform.
| Role | Level | Description | Key Permissions |
|---|---|---|---|
| Super Administrator | 100 | Complete platform control with billing and compliance oversight | user.manage.all, policy.manage.all, system.configure.all, billing.manage.all, compliance.manage.all, audit.view.all, security.manage.all, tenant.manage.all |
| Policy Administrator | 80 | Create and manage controls with audit log access | policy.create, policy.edit, policy.delete, policy.deploy, policy.test, audit.view.policies, resource.manage, context.manage |
| Security Analyst | 70 | Monitor security events and analyze compliance | security.monitor, audit.view.security, compliance.view, incident.manage, policy.view, resource.view |
| Resource Manager | 60 | Configure protected resources and data sources | resource.create, resource.edit, resource.delete, resource.configure, context.source.manage, policy.view, audit.view.resources |
| Developer | 40 | Develop and test controls with limited deployment access | policy.create, policy.edit, policy.test, policy.view, resource.view, context.view |
| Viewer | 20 | Read-only access to dashboards and reports | policy.view, resource.view, audit.view.basic, dashboard.view |
Role Assignment Best Practices
- Assign the lowest role that allows the user to perform their job function
- Use Super Administrator sparingly — only for platform owners and billing managers
- Policy Administrator is the recommended role for control authors who need to deploy to production
- Developer is appropriate for engineers who author and test controls but should not deploy to production without review
- All role assignments are audited — changes appear in Audit Logs
Strict Role Enforcement
Control Core enforces role permissions strictly by default. A user whose role does not include a required permission receives a clear "permission denied" response (HTTP 403) and the Control Plane UI hides pages they cannot use. The built-in ccadmin Super Administrator always retains full access and can never be locked out.
- The behavior is governed by the Strict role enforcement feature flag (Settings → Feature Flags), which is on in new installations.
- If you are migrating an existing deployment and need a transition window, you can turn the flag off temporarily: actions that would be blocked still run, but each one is recorded so you can review who would have been denied before enabling strict mode.
- Turn it back on once your role assignments are confirmed. Leaving it off is not recommended for production.
Troubleshooting: If a user reports "Access denied" on a page they previously used, confirm their role includes the relevant permission in the table above. Re-assign the appropriate role under Settings → Users; the change is audited and takes effect on their next page load.
Creating and Managing Users
Manual User Creation
When SSO is not configured, the Super Administrator can create users manually:
- Navigate to Settings → Users → Users tab
- Click Create User
- Fill in the required fields: email, display name, role, and department
- The user receives credentials via the configured method (email or manual distribution)
Troubleshooting: If the Create User button is disabled, SSO may be active. When SSO is enabled, user provisioning flows through your identity provider — only the built-in
ccadminaccount can be created manually.
User Lifecycle
- Active — user can log in and access the platform per their role
- Inactive — user account exists but login is disabled
- Suspended — temporarily locked (e.g., after failed login attempts or administrative action)
- Pending — user created but has not completed initial authentication
Editing Users
- Click the edit icon next to a user in the user table
- Update role, department, or status as needed
- Click Save
All user modifications generate an audit trail entry.
SSO Configuration
Control Core supports enterprise Single Sign-On via OIDC and SAML 2.0 protocols.
Supported Identity Providers
| Provider | Protocol | Issuer URL Example |
|---|---|---|
| Microsoft Azure AD / Entra ID | OIDC | https://login.microsoftonline.com/{tenant_id}/v2.0 |
| Okta | OIDC | https://{your-domain}.okta.com/oauth2/default |
| Auth0 | OIDC | https://{tenant}.auth0.com/ |
| PingID / PingOne | OIDC | https://auth.pingone.com/{env_id}/as |
| Google Workspace | OIDC | https://accounts.google.com |
| Generic OIDC | OIDC | Any RFC-compliant OIDC issuer |
| Generic SAML 2.0 | SAML | N/A (uses SAML_SSO_URL) |
OIDC Environment Variables
All OIDC providers share a common set of environment variables:
| Variable | Description | Example |
|---|---|---|
OIDC_CLIENT_ID | Application / client ID from your IdP | — |
OIDC_CLIENT_SECRET | Client secret value | — |
OIDC_ISSUER_URL | OIDC discovery endpoint base URL | https://login.microsoftonline.com/{tenant}/v2.0 |
OIDC_REDIRECT_URI | OAuth callback URL for Control Core | https://controlplane.example.com/auth/sso/callback |
OIDC_ROLE_CLAIM | ID token claim containing user role/group | roles (Entra), groups (Okta) |
Secure OIDC by default. Control Core uses the Authorization Code flow with PKCE (S256) and a per-login nonce, and it cryptographically verifies every ID token's signature against your provider's published JWKS (jwks_uri in the discovery document) before trusting any claim. Issuer, audience, expiry, and nonce are all validated. No additional configuration is required — any standards-compliant OIDC provider exposes the discovery document and JWKS that Control Core needs.
Troubleshooting: If OIDC login fails with "token verification failed", confirm
OIDC_ISSUER_URLpoints at the issuer whose.well-known/openid-configurationlists a reachablejwks_uri, and that the Control Plane can make outbound HTTPS calls to that JWKS endpoint.
For SAML 2.0, set AUTH_METHOD_SSO_SAML_ENABLED=true and configure both the identity-provider (IdP) and service-provider (SP) sides:
| Variable | Side | Description |
|---|---|---|
SAML_ENTITY_ID | IdP | IdP entity ID / issuer |
SAML_SSO_URL | IdP | IdP single-sign-on (redirect) URL |
SAML_CERTIFICATE | IdP | IdP X.509 signing certificate (PEM, used to verify assertion signatures) |
SAML_SP_ENTITY_ID | SP | Control Core entity ID (e.g. https://controlplane.example.com/saml) |
SAML_SP_ACS_URL | SP | Assertion Consumer Service URL (https://controlplane.example.com/auth/saml/callback) |
SAML_ROLE_ATTRIBUTE | Mapping | Assertion attribute carrying the user's group/role (e.g. Role, memberOf) |
SAML_ROLE_MAPPING_JSON | Mapping | Optional JSON mapping IdP role strings → Control Core role IDs |
SAML_DEFAULT_ROLE | Mapping | Role assigned when no mapping matches (defaults to viewer) |
SAML assertion signatures are validated against SAML_CERTIFICATE on every login; assertions that are unsigned, expired, or fail signature checks are rejected. The Control Plane container image bundles the native xmlsec dependency required for signature verification.
Role Mapping
Map identity provider roles/groups to Control Core roles:
- Navigate to Settings → Users → SSO tab
- Scroll to Role Mapping
- For each IdP group/role, select the corresponding Control Core role
- Click Save role mapping
Users without a matching role mapping default to Viewer.
The role claim is configured via the OIDC_ROLE_CLAIM environment variable. You can also override all mappings via OIDC_ROLE_MAPPING_JSON (JSON object mapping IdP role strings to Control Core role IDs).
Applying SSO Configuration
Environment variables are read on service startup. After updating them:
- Set the environment variables in your deployment configuration (Helm values, Docker Compose, or
.env) - Restart the Control Core PAP API service
- Use Test Connection in the SSO tab to validate the OIDC discovery document
- Sign out and sign back in from the SSO tab on the login page
- Monitor user provisioning in the Users tab
Important: While SSO is enabled, only the built-in
ccadminaccount can create users manually. All other provisioning flows through your identity provider.
Troubleshooting: If Test Connection fails, verify that
OIDC_ISSUER_URLresolves to a valid.well-known/openid-configurationendpoint. Check network connectivity between the Control Plane and your IdP. Common causes: firewall rules blocking outbound HTTPS, incorrect tenant ID in the issuer URL, or expired client secret.
Passkeys (WebAuthn)
Passkeys are a modern, phishing-resistant authentication method based on the WebAuthn/FIDO2 standard. They use your device's built-in security features — fingerprint readers, face recognition, or hardware security keys — to authenticate without passwords.
Why Passkeys
- No passwords to remember or manage — eliminates password fatigue and reuse
- Phishing resistant — cryptographic challenge-response bound to the origin; cannot be replayed on a fake site
- Cross-device sync — passkeys stored in iCloud Keychain, Google Password Manager, or Windows Hello sync across your devices
- Faster login — biometric verification is typically faster than typing a password + MFA code
Registering a Passkey
- Navigate to Settings → Users → Passkeys tab
- Click Register New Passkey
- Follow the browser prompt to create a passkey using your device's biometric or security key
- The passkey appears in your registered passkeys list
Managing Passkeys
- View all registered passkeys with their creation date and last-used timestamp
- Delete passkeys you no longer use by clicking the delete icon
Environment Variables
| Variable | Description | Example |
|---|---|---|
PASSKEY_RP_ID | Relying Party ID (your domain) | controlplane.example.com |
PASSKEY_ALLOWED_ORIGINS | Comma-separated list of allowed origins | https://controlplane.example.com |
FRONTEND_URL | Frontend URL for WebAuthn origin validation | https://controlplane.example.com |
Browser Support
Passkeys are supported in all modern browsers:
| Browser | Desktop | Mobile |
|---|---|---|
| Chrome | 109+ | 109+ |
| Safari | 16+ | 16+ |
| Firefox | 122+ | 122+ |
| Edge | 109+ | 109+ |
Troubleshooting: If passkey registration fails, verify that
PASSKEY_RP_IDmatches your domain exactly (no protocol prefix, no port). EnsurePASSKEY_ALLOWED_ORIGINSincludes the full origin with protocol. Check that your browser supports WebAuthn and that biometric authentication is enabled on your device.
MFA Configuration
Multi-factor authentication adds a second verification step after password login using a Time-based One-Time Password (TOTP) authenticator app.
Enabling Organization-Wide MFA
- Navigate to Settings → Users → MFA tab
- Toggle Require MFA for all users (or set
AUTH_REQUIRE_MFA=truein your deployment configuration) - When enabled, all users must configure MFA before accessing the platform
How enforcement works at login:
- A user who has enrolled an authenticator is always challenged for a 6-digit TOTP code after a correct password — regardless of the org-wide setting. Login does not complete until a valid code is supplied.
- When MFA is required (
AUTH_REQUIRE_MFA=true) and a user has not enrolled, that user is blocked from completing login until they enroll. Provide an enrollment window before turning this on org-wide. - The built-in
ccadminbootstrap account is exempt from the not-enrolled block so an administrator can never be locked out while rolling MFA out;ccadminshould still enrol an authenticator as a best practice. - Programmatic logins supply the code via the
mfa_codefield on the login request; interactive logins are prompted automatically.
Supported Authenticator Apps
- Google Authenticator — Android and iOS
- Microsoft Authenticator — Android, iOS, and Windows
MFA Setup (Per User)
- Open the MFA setup dialog (triggered on next login when MFA is required, or via user settings)
- Scan the displayed QR code with your authenticator app
- Enter the 6-digit verification code from the app
- MFA is now active for your account
Per-User MFA Status
The MFA tab shows a table of all users with their current MFA enrollment status. Super Administrators can:
- View which users have MFA enabled
- Reset MFA for a user who has lost access to their authenticator
Troubleshooting: If a user cannot complete MFA setup, ensure their authenticator app's clock is synchronized (TOTP codes are time-sensitive, typically with a 30-second window). If a user loses their authenticator device, a Super Administrator can reset their MFA enrollment from the MFA tab.
Authentication Methods
Control Core supports multiple authentication methods that can be enabled or disabled based on your organization's security requirements.
Available Methods
| Method | Description | Env Variable |
|---|---|---|
| Password | Traditional username + password | AUTH_METHOD_PASSWORD_ENABLED |
| Passkey | WebAuthn/FIDO2 passwordless | AUTH_METHOD_PASSKEY_ENABLED |
| Magic Link | Email-based passwordless login | AUTH_METHOD_MAGIC_LINK_ENABLED |
| SSO (OIDC) | Enterprise identity provider | AUTH_METHOD_SSO_OIDC_ENABLED |
| SSO (SAML) | Enterprise SAML 2.0 | AUTH_METHOD_SSO_SAML_ENABLED |
Session Management
Operational guidance for administrators:
- Use Settings → General → Security → Session Timeout (minutes) to define how much idle time (no qualifying interaction or navigation recorded in that browser tab) is allowed before the warning banner appears for Control Plane operators. Typical platform default is 60 minutes unless your deployment seeded a different baseline. Administrators may choose 5–480 minutes aligned with organizational risk posture.
- After the countdown on the banner elapses without a choice or after an explicit logout, users must authenticate again—the Control Plane clears local session artifacts.
- Stay Logged In asks the backend to mint a rotated access token and restarts idle timing;
POST /auth/refreshonly succeeds inside server-enforced concurrency and uninterrupted-duration caps. - Configure
CONTROL_CORE_SESSION_MAX_ABSOLUTE_HOURSandCONTROL_CORE_SESSION_MAX_CONCURRENTon the Control Plane API when you need tighter upper bounds on uninterrupted browser tenancy or simultaneous interactive sessions—these safeguards override purely idle-based timelines.
Consult your deployment changelog for Authentication Methods tuning (remember-device windows, SSO-only flows).
Troubleshooting: If “Stay Logged In” redirects to
/login, confirmPOST /auth/refreshreturns HTTP 200 in the developer tools Network tab immediately after pressing the button. Review Control Plane API diagnostics for revocation or concurrency limits (CONTROL_CORE_SESSION_MAX_CONCURRENT).
Token Signing and Service Hardening
Asymmetric token signing (RS256) and JWKS
By default the Control Plane signs session tokens with RS256 (an asymmetric keypair). The private key never leaves the Control Plane API; the public key is published so other services can verify tokens without holding a secret.
- Public verification keys:
GET /auth/jwks.jsonreturns the active public key(s) in standard JWKS format. Downstream services and Bouncers can fetch this endpoint to verify Control Plane–issued tokens. - Key rotation: A Super Administrator can rotate the signing key with
POST /auth/keys/rotate. The previous public key remains published until in-flight tokens expire, so rotation is zero-downtime. Rotate on your normal cryptographic cadence (≤ 90 days) or immediately on suspected compromise. - Compatibility: Set
JWT_SIGNING_ALG=HS256only if you have a specific reason to fall back to symmetric signing; RS256 is recommended for all production deployments.
Troubleshooting: If a downstream verifier reports an unknown key ID (
kid), it is caching a stale JWKS. Have it re-fetchGET /auth/jwks.json; after a rotation both the new and previous keys are listed until old tokens expire.
CORS hardening
In production-like deployments the Control Plane API refuses to start if CORS_ORIGINS is left as the wildcard *. Set CORS_ORIGINS to the exact Control Plane frontend origin(s), comma-separated:
CORS_ORIGINS=https://controlplane.example.com
Troubleshooting: If the API container exits immediately at startup with a
CORS_ORIGINS='*' is not permittederror, setCORS_ORIGINSto your real frontend origin(s) and redeploy. Wildcard CORS is only tolerated in local/non-production environments.
Troubleshooting
Cannot Log In
| Symptom | Possible Cause | Fix |
|---|---|---|
| Login page shows "Invalid credentials" | Wrong password or account locked | Reset password via ccadmin, check user status in the Users tab |
| SSO redirect fails | Incorrect OIDC_ISSUER_URL or expired client secret | Verify env vars, run Test Connection from SSO tab |
| "Account not found" after SSO login | User not provisioned, role mapping missing | Add a role mapping for the user's IdP group |
| MFA code rejected | Clock drift on authenticator device | Sync device clock; if persistent, admin resets MFA |
Passkey Issues
| Symptom | Possible Cause | Fix |
|---|---|---|
| "Registration failed" | PASSKEY_RP_ID mismatch | Set PASSKEY_RP_ID to your exact domain (e.g., controlplane.example.com) |
| Passkey not offered on login | Browser does not support WebAuthn | Update browser; ensure biometrics enabled |
| Passkey works on one device but not another | Passkey not synced | Use a sync-capable credential manager (iCloud Keychain, Google Password Manager) |
SSO Issues
| Symptom | Possible Cause | Fix |
|---|---|---|
| Test Connection returns error | IdP unreachable or invalid discovery URL | Check network, verify OIDC_ISSUER_URL ends correctly |
| Users get Viewer role despite IdP groups | Role claim name mismatch | Verify OIDC_ROLE_CLAIM matches the claim name in your IdP's ID token |
| Manual user creation disabled | SSO is active | Expected behavior; provision users through your IdP |
Next Steps
- Administrator Guide — full platform administration reference
- Configuration Reference — complete environment variable reference including authentication
- Security Overview — platform security architecture and compliance
- Admin Troubleshooting — broader troubleshooting guide for all admin operations