Enterprise Single Sign-On (SSO) Setup
Enable your team to log in using your organization's identity provider via SAML 2.0 or OIDC (OpenID Connect), with automatic user provisioning via SCIM 2.0 and role assignment through group mappings.
SSO requires Admin role in your Plexicus organization. Configuration changes are audited in Settings → Organization → Audit Log.
Supported Protocols & Providers
SAML 2.0
- Best for: Enterprise organizations with mature identity infrastructure
- Supported Providers:
- Okta (step-by-step guide below)
- Azure AD / Entra ID (step-by-step guide below)
- Google Workspace (SAML via admin console)
- Ping Identity, OneLogin, Keycloak, and any SAML 2.0-compliant IdP
- Features:
- XML metadata auto-upload to IdP or manual endpoint registration
- Attribute-based Just-in-Time (JIT) user provisioning
- Certificate rotation with staging window (zero-downtime IdP cert updates)
- SP-initiated (user clicks "Sign in with SSO") and IdP-initiated flows (admin portal links)
- Signing & encryption options (assertions, responses, metadata)
SAML Bindings: HTTP-POST (default, recommended) and HTTP-Redirect (supported).
OIDC (OpenID Connect)
- Best for: SaaS and modern cloud-native identity platforms
- Supported Providers:
- Okta (via OIDC app)
- Azure AD / Entra ID (via app registration)
- Google Workspace (via OAuth app)
- Auth0, Cognito, Keycloak, and any OpenID Connect provider
- Features:
- OAuth 2.0 authorization code flow + PKCE (default-enabled for security)
- Auto-discovery via OIDC metadata endpoints (
.well-known/openid-configuration) - ID token + access token handling
- Refresh token support (standard OIDC)
Default Scopes: openid, email, profile. Customizable per provider.
SSO Configuration Modes
Choose the enforcement level that matches your organization's security posture:
| Mode | User Behavior | When to Use |
|---|---|---|
| Coexist (default) | Login page offers both SSO and password options | Gradual rollout; testing SSO before enforcement |
| SSO Preferred | SSO tab shown first; users can fall back to password | Near-enforcement; flexibility for edge cases |
| SSO Enforced | Only SSO available; password login disabled | Full enterprise lockdown (requires successful dry-run within 24 hours) |
Before enabling SSO Enforced: Run a successful dry-run validation (see Validate Configuration) to confirm your IdP setup works. Misconfiguration can lock out admins. Use Break-Glass Access to recover.
SAML 2.0 Configuration
Plexicus acts as a SAML 2.0 Service Provider (SP). Your identity provider must support SAML 2.0 and allow you to register applications.
Plexicus SAML Service Provider Details
When configuring your IdP, use these Plexicus-side values:
| Setting | Value |
|---|---|
| SP Entity ID | https://api.plexicus.ai/ (or custom domain for self-hosted) |
| Assertion Consumer Service (ACS) URL | https://api.plexicus.ai/auth/sso/{client_slug}/acs |
| Single Logout Service (SLO) URL | https://api.plexicus.ai/auth/sso/{client_slug}/sls |
| NameID Format | urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress |
| Metadata URL | https://api.plexicus.ai/auth/sso/{client_slug}/metadata |
| SAML Binding | HTTP-POST (default); HTTP-Redirect supported |
| Signature Requirements | Assertions signed (required); response signing optional |
Replace {client_slug} with your organization's unique slug (you can customize this in Settings → Authentication → SSO → Configure → Slug Settings).
Setup: Okta
Okta Step 1: Create SAML 2.0 Application
- Log in to your Okta admin console.
- Go to Applications → Applications → click Create App Integration.
- Select SAML 2.0 as the sign-in method.
- Click Create.
Okta Step 2: Configure SAML Settings
- Enter App name (e.g., "Plexicus").
- In Configure SAML section, enter:
- Single sign on URL:
https://api.plexicus.ai/auth/sso/{client_slug}/acs - Audience URI (SP Entity ID):
https://api.plexicus.ai/ - Name ID format:
Email(orunspecified) - Application username:
Email
- Single sign on URL:
- Leave Response and Assertion signing defaults unless your security policy requires signed responses.
Okta Step 3: Attribute Mapping
-
In Attribute Statements, add:
email→user.emailgiven_name→user.firstNamefamily_name→user.lastNamegroups→appuser.groups(if using group-based role assignment)
-
Optionally set Group Attribute Statements to map Okta groups to Plexicus roles (see Group-to-Role Mapping below).
Okta Step 4: Retrieve IdP Metadata
- In the Sign On tab, scroll to SAML Signing Certificates.
- Click View IdP Metadata (or copy the metadata URL).
- Keep this metadata URL or XML file — you'll use it in Plexicus.
Okta Step 5: Finalize in Plexicus
- In Plexicus, go to Settings → Authentication → SSO.
- Click Setup → Okta (if available) or Generic SAML 2.0.
- Choose import method:
- Paste Metadata XML (recommended) — Copy IdP metadata XML and paste it. Plexicus auto-extracts entity ID, SSO URL, and certificate.
- Enter Metadata URL — Provide the Okta metadata URL; Plexicus fetches and validates it.
- Manual Entry — Enter values individually.
- Proceed to Attribute Mapping and Validation.
Setup: Azure AD / Entra ID
Azure AD Step 1: Create Enterprise Application
- Log in to Azure Portal → go to Azure Active Directory → Enterprise Applications.
- Click New application → Create your own application.
- Name it (e.g., "Plexicus"), select Integrate any other application you don't find in the gallery, and click Create.
Azure AD Step 2: Configure SAML
- Go to Single sign-on → select SAML.
- In Set up Single Sign-On with SAML section, click Edit on Basic SAML Configuration:
- Identifier (Entity ID):
https://api.plexicus.ai/ - Reply URL (Assertion Consumer Service URL):
https://api.plexicus.ai/auth/sso/{client_slug}/acs - Sign on URL:
https://api.plexicus.ai/auth/sso/{client_slug}/login - Relay State (optional): leave blank
- Identifier (Entity ID):
- Click Save.
Azure AD Step 3: User Attributes & Claims
- In the SAML-based sign-on page, edit User Attributes & Claims:
- Ensure these claims exist:
email— required; sourceuser.mailoruser.userprincipalnamegiven_name— sourceuser.givennamefamily_name— sourceuser.surnamegroups(optional) — sourceuser.groups(requires premium, or use on-premises groups)
- Click Save.
Azure AD Step 4: Download Certificate & Metadata
- In SAML Signing Certificate section, download the Certificate (Base64).
- Also copy the App Federation Metadata URL (you'll use it in Plexicus).
Azure AD Step 5: Finalize in Plexicus
- In Plexicus, go to Settings → Authentication → SSO.
- Click Setup → Azure AD (if available) or Generic SAML 2.0.
- Recommended: Use Enter Metadata URL and paste the App Federation Metadata URL from Azure.
- Alternatively, manually enter:
- IdP Entity ID — Azure AD's Entity ID (shown in SAML config)
- IdP SSO URL — Azure's Login URL (shown in SAML config)
- IdP X.509 Certificate — Paste the downloaded Base64 certificate (including
-----BEGIN CERTIFICATE-----)
- Proceed to Attribute Mapping and Validation.
Setup: Generic SAML 2.0 (Any IdP)
For identity providers not listed above, follow this generic workflow:
Generic Step 1: Register Plexicus in Your IdP
In your IdP's admin console, create a new SAML 2.0 application with:
- SP Entity ID:
https://api.plexicus.ai/ - ACS URL:
https://api.plexicus.ai/auth/sso/{client_slug}/acs - SLO URL (optional):
https://api.plexicus.ai/auth/sso/{client_slug}/sls - NameID Format:
urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
Generic Step 2: Retrieve IdP Metadata
Export the IdP's SAML metadata (usually an XML file or URL) and save it.
Generic Step 3: Configure Plexicus
- Go to Settings → Authentication → SSO → Configure → Generic SAML 2.0.
- Option A (Recommended): Paste the IdP metadata XML directly. Plexicus parses:
- IdP Entity ID
- IdP SSO URL
- IdP X.509 Certificate
- Option B: If metadata is unavailable, manually enter:
- IdP Entity ID — Unique identifier from your IdP
- IdP SSO URL — Login endpoint URL
- IdP X.509 Certificate — Public certificate in PEM format (including
-----BEGIN CERTIFICATE-----and-----END CERTIFICATE-----) - IdP SLO URL (optional) — Logout endpoint
Generic Step 4: Proceed to Validation
Once entered, test the configuration (see Validate Configuration below).
Attribute Mapping
By default, Plexicus maps SAML attributes to user fields as follows:
| Plexicus Field | Default SAML Attribute | Customizable |
|---|---|---|
| Email (required) | email | Yes |
| First Name | given_name | Yes |
| Last Name | family_name | Yes |
| Groups (for role mapping) | groups | Yes |
To customize attribute mappings:
- In Settings → Authentication → SSO → Advanced Settings, click Attribute Mapping.
- For each field, enter the SAML attribute name your IdP sends.
- Example: If your IdP sends email as
emailAddressinstead ofemail, update the mapping.
- Example: If your IdP sends email as
- Click Save.
The email attribute is required and must be a valid email address. If missing or malformed, user provisioning fails.
Group-to-Role Mapping
Automatically assign Plexicus roles based on IdP group membership at login (requires SSO + JIT provisioning).
Prerequisites
- SSO is configured (SAML or OIDC)
- Your IdP supports group assertions (most enterprise IdPs do)
- Groups attribute is mapped in Attribute Mapping
Setup Group Mapping
- Go to Settings → Authentication → SSO → Advanced Settings → Group Role Mappings.
- Click Add Mapping:
- IdP Group Name — Exact group name from your IdP (e.g.,
security-team,developers) - Plexicus Role — Select a built-in or custom role (see Roles & RBAC)
- IdP Group Name — Exact group name from your IdP (e.g.,
- Repeat for each group/role pair.
- Click Save.
Behavior
- When a user logs in via SSO for the first time, Plexicus checks their IdP groups.
- If their group matches a mapping, they are assigned the corresponding Plexicus role automatically.
- Existing users who already have a role keep their manually assigned role; group mapping does not override.
- If a user is in multiple groups with different role mappings, the first match (by order in the list) is applied.
Example: Okta + Plexicus Role Mapping
| Okta Group | Plexicus Role | Permissions |
|---|---|---|
security-team | Cyberoper | Manage integrations, policies, analytics |
developers | Developer | View findings, create remediations |
admins | Admin | Full organizational access |
Validate Configuration
Before activating SSO, always run a dry-run validation:
- Go to Settings → Authentication → SSO → Validate Configuration.
- Plexicus performs:
- Certificate/key verification
- IdP endpoint connectivity (metadata fetch, if URL provided)
- Attribute mapping validation (against IdP metadata)
- Signature algorithm compatibility
- Review the validation report:
- ✅ Success: All checks passed. Safe to proceed to Activate SAML.
- ⚠️ Warning: Non-critical issues (e.g., optional SLO URL missing). May proceed.
- ❌ Error: Critical issue. Fix before activation (see Troubleshooting below).
To enable SSO Enforced mode, validation must pass and be completed within the last 24 hours. Once enabled, enforce mode cannot be reversed without a new successful validation.
OIDC (OpenID Connect) Configuration
Plexicus acts as an OIDC Relying Party (RP) / client and supports the OAuth 2.0 authorization code flow with PKCE enabled by default.
Setup: Okta OIDC
Okta Step 1: Create OIDC Application
- Log in to your Okta admin console.
- Go to Applications → Applications → click Create App Integration.
- Select OIDC - OpenID Connect as the sign-in method.
- Click Create.
Okta Step 2: Configure App Integration
- Enter App integration name (e.g., "Plexicus OIDC").
- Under Grant type, ensure Authorization Code is checked (and optionally Refresh Token).
- In Sign-in redirect URIs, add:
https://api.plexicus.ai/auth/sso/{client_slug}/oidc/callback - Leave Sign-out redirect URIs empty (or add
https://api.plexicus.ai/). - Click Save.
Okta Step 3: Retrieve Credentials & Metadata
- In the app's General tab, copy:
- Client ID
- Client Secret (click Show)
- Note the Okta domain (e.g.,
dev-12345.okta.com). - The Discovery URL is:
https://dev-12345.okta.com/.well-known/openid-configuration
Okta Step 4: Finalize in Plexicus
- In Plexicus, go to Settings → Authentication → SSO.
- Click Setup → Okta (OIDC) or Generic OIDC.
- Enter:
- Discovery URL:
https://<your-okta-domain>/.well-known/openid-configuration - Client ID: From Okta
- Client Secret: From Okta (never share this; kept encrypted in Plexicus)
- Scopes (optional): Default
openid email profileis recommended
- Discovery URL:
- Proceed to Attribute Mapping and Validation.
Setup: Azure AD / Entra ID OIDC
Azure AD Step 1: Create App Registration
- Log in to Azure Portal → Azure Active Directory → App registrations.
- Click New registration.
- Enter Name (e.g., "Plexicus OIDC").
- Under Supported account types, select your organization type.
- In Redirect URI, select Web and enter:
https://api.plexicus.ai/auth/sso/{client_slug}/oidc/callback - Click Register.
Azure AD Step 2: Retrieve Credentials
- In the app overview, copy:
- Application (client) ID
- Directory (tenant) ID
- Go to Certificates & secrets → Client secrets → New client secret.
- Copy the Value (secret itself; not the ID).
Azure AD Step 3: Configure Permissions
- Go to API permissions.
- Ensure these permissions are granted:
openid,email,profile(delegated, granted forMicrosoft Graph)
- Grant admin consent.
Azure AD Step 4: Get Discovery URL
The Discovery URL for Azure AD is:
https://login.microsoftonline.com/{directory_tenant_id}/.well-known/openid-configuration
Replace {directory_tenant_id} with your Tenant ID from Step 2.
Azure AD Step 5: Finalize in Plexicus
- In Plexicus, go to Settings → Authentication → SSO.
- Click Setup → Azure AD (OIDC) or Generic OIDC.
- Enter:
- Discovery URL:
https://login.microsoftonline.com/{tenant_id}/.well-known/openid-configuration - Client ID: Application (client) ID
- Client Secret: From Certificates & secrets
- Scopes (optional): Default
openid email profileis sufficient; addgroupsif using group-based role assignment
- Discovery URL:
- Proceed to Attribute Mapping and Validation.
Setup: Generic OIDC (Any Provider)
For providers like Auth0, Cognito, Google, or other OpenID Connect-compliant providers:
Generic Step 1: Retrieve Provider Metadata
From your OIDC provider's admin console, find the Discovery URL (also called OIDC metadata endpoint):
- Auth0:
https://<your-domain>.auth0.com/.well-known/openid-configuration - Cognito:
https://cognito-idp.<region>.amazonaws.com/<user_pool_id>/.well-known/openid-configuration - Google:
https://accounts.google.com/.well-known/openid-configuration
Generic Step 2: Register Plexicus Redirect URI
In your provider's app settings, add the Redirect URI:
https://api.plexicus.ai/auth/sso/{client_slug}/oidc/callback
Generic Step 3: Create Credentials
Create an application and note:
- Client ID
- Client Secret
- Discovery URL
- Supported scopes (typically
openid,email,profile, optionallygroups)
Generic Step 4: Configure in Plexicus
- Go to Settings → Authentication → SSO → Configure → Generic OIDC.
- Enter:
- Discovery URL
- Client ID
- Client Secret
- Scopes (comma-separated, optional; defaults to
openid,email,profile)
- Click Validate Configuration to verify connectivity.
- If validation passes, click Activate OIDC.
PKCE Security (Default Enabled)
PKCE (Proof Key for Code Exchange) is enabled by default on all OIDC flows. It adds extra protection against authorization code interception (mitigates desktop/mobile app vulnerabilities and man-in-the-middle attacks on the callback).
You do not need to configure PKCE manually — Plexicus handles it transparently. For details, see OIDC PKCE & Security.
Attribute Mapping (OIDC Claims)
By default, Plexicus maps OIDC claims to user fields as:
| Plexicus Field | Default OIDC Claim | Customizable |
|---|---|---|
| Email (required) | email | Yes |
| First Name | given_name | Yes |
| Last Name | family_name | Yes |
| Groups (for role mapping) | groups | Yes |
To customize claim mappings:
- In Settings → Authentication → SSO → Advanced Settings, click Attribute Mapping.
- For each field, enter the claim name your provider sends (e.g., if Auth0 uses
email_verifiedinstead ofemail, map accordingly). - Click Save.
Your OIDC provider must include the mapped claims in the ID token. If a claim is missing, user provisioning will fail or the field will be empty.
Just-in-Time (JIT) Provisioning
When SSO is enabled, Plexicus can automatically create user accounts on first login using JIT provisioning.
Configuration
- Navigate to Settings → Authentication → SSO.
- Under Advanced Settings, configure:
- JIT Enabled — Toggle on/off (default: enabled)
- Default Role — Role assigned to newly provisioned users (default: Developer)
Behavior
- When a user logs in via SSO for the first time, Plexicus creates an account with their email and extracted attributes (name, groups).
- If group-role mapping is configured, the user's IdP group determines their role.
- Otherwise, the Default Role is assigned.
- Existing users who link SSO to their account keep their current role.
If JIT is disabled and a user who hasn't been pre-provisioned tries to log in, they'll see a "User not found" error. Pre-invite all users before disabling JIT.
Self-Hosted Deployments
If running Plexicus self-hosted via Helm, SSO relies on three secrets in your Helm chart:
helm install plexicus ./helm-chart \
--set global.required.secrets.breakGlassSecretKey="your-secret-key" \
--set global.required.secrets.ssoRelayStateSecret="your-relay-state-secret" \
--set global.required.secrets.ssoEncryptionKey="your-encryption-key"
| Secret | Purpose |
|---|---|
BREAK_GLASS_SECRET_KEY | Enables admin break-glass access if SSO is misconfigured (admin-only recovery) |
SSO_RELAY_STATE_SECRET | HMAC secret for SAML RelayState signing (prevents open-redirect attacks) |
SSO_ENCRYPTION_KEY | Encrypts OIDC client secrets at rest |
Never commit secrets to version control. Use your deployment platform's secret management (e.g., Sealed Secrets, HashiCorp Vault).
For more details, see Self-Hosted Configuration.
SCIM 2.0 User Provisioning (Enterprise)
SCIM provisioning is available on the Enterprise plan (SaaS) or all tiers (self-hosted).
SCIM 2.0 fully complies with RFC 7644. It allows automatic user and group provisioning from your IdP, eliminating manual invites and keeping Plexicus memberships synchronized with your IdP.
Generate SCIM Bearer Token
- Go to Settings → Authentication → SSO → SCIM Tokens.
- Click Create Token.
- Configure:
- Token Name (e.g., "Okta SCIM")
- Expiration (default: 1 year; set to custom if desired)
- Click Generate.
- Copy the token immediately — it is displayed only once. Store it securely (e.g., in your IdP's secret manager).
Configure SCIM in Your IdP
Once the token is generated, configure your IdP's SCIM connector:
| Setting | Value |
|---|---|
| Base URL | https://api.plexicus.ai/scim/v2 |
| Bearer Token | Token from step above (keep confidential) |
| Authentication | Bearer token auth (no username/password) |
Okta SCIM Configuration
- In your Okta SAML/OIDC app, go to the Provisioning tab.
- Click Configure API Integration.
- Enable API Integration and select SCIM 2.0.
- Enter:
- SCIM connector base URL:
https://api.plexicus.ai/scim/v2 - Unique identifier field for users:
email
- SCIM connector base URL:
- Click Authenticate with Plexicus or enter the bearer token manually.
- Click Save.
- Go to To App → Enable Create Users and Update User Attributes as needed.
- In Attribute Mappings, ensure:
email→ Oktaemail(required)givenName→ OktafirstNamefamilyName→ OktalastName
Azure AD SCIM Configuration
- In your Azure app registration, go to the Provisioning tab.
- Set Provisioning Status to On.
- Configure Admin Credentials:
- Tenant URL:
https://api.plexicus.ai/scim/v2 - Secret Token: Paste the SCIM Bearer Token
- Tenant URL:
- Click Test Connection to verify.
- Go to Mappings and ensure attribute mappings match (email, name, etc.).
- Click Save and Start provisioning if ready.
Generic SCIM Setup
For other IdPs (Auth0, Cognito, custom systems), provide:
- Base URL:
https://api.plexicus.ai/scim/v2 - Authentication: Bearer token (in
Authorization: Bearer <token>header) - Standard SCIM 2.0 endpoints:
POST /scim/v2/Users— Create userGET /scim/v2/Users— List usersPATCH /scim/v2/Users/{id}— Update userDELETE /scim/v2/Users/{id}— Delete user
Supported SCIM Operations
Plexicus SCIM 2.0 supports:
| Operation | Endpoint | Behavior |
|---|---|---|
| Create user | POST /Users | Creates Plexicus account with email, name, groups |
| List users | GET /Users | Returns all provisioned users (paginated) |
| Get user | GET /Users/{id} | Returns user details |
| Update user | PUT /Users/{id} or PATCH /Users/{id} | Updates email, name, active status, groups |
| Deactivate user | PATCH /Users/{id} with active: false | Disables user access (doesn't delete account) |
| Delete user | DELETE /Users/{id} | Soft-delete; user account marked inactive |
| List groups | GET /Groups | Returns provisioned groups |
| Create group | POST /Groups | Creates group in Plexicus |
SCIM Token Rotation
Tokens expire after 1 year (or custom expiration set at creation). To rotate without service interruption:
- Go to Settings → Authentication → SSO → SCIM Tokens.
- Click the token name → Rotate.
- A new token is generated; the old token remains valid for 7 days (grace period).
- Update your IdP's SCIM configuration with the new token immediately.
- After 7 days, the old token is revoked automatically.
To revoke a token immediately (e.g., if compromised):
- Go to Settings → Authentication → SSO → SCIM Tokens.
- Click the token → Delete.
- The token is invalidated immediately; update your IdP SCIM config urgently.
Certificate & Secret Rotation
SAML Certificate Rotation (IdP Certificates)
When your IdP rotates its signing certificate, you have two options in Plexicus:
Option 1: Stage + Promote (Recommended for Zero Downtime)
- Go to Settings → Authentication → SSO → Advanced Settings.
- Click Stage New Certificate.
- Paste the new IdP X.509 certificate.
- Plexicus now accepts both the old and new certificates for 7 days (staging window).
- Once your IdP completes the rotation on their end, click Promote.
- The new certificate becomes primary; old certificate is archived.
Option 2: Immediate Replacement
- Go to Settings → Authentication → SSO → Advanced Settings.
- Click Replace Certificate and paste the new certificate.
- Immediately switch to new certificate — old one is discarded.
- Use this only if your IdP has already rotated and old cert is no longer in use (risking login failures if IdP still sends old cert).
Clock Skew Tolerance
Plexicus allows ±120 seconds of clock drift when validating SAML signatures. If you experience "signature invalid" errors despite correct certificates, check:
- IdP server time (NTP sync)
- Plexicus server time (NTP sync)
- IdP certificate validity period (not yet valid or expired)
OIDC Client Secret Rotation
Your OIDC provider may require periodic secret rotation for security compliance:
- In your OIDC provider's console (Okta, Azure, Auth0), generate a new client secret.
- Go to Settings → Authentication → SSO.
- Click Edit OIDC Configuration.
- Update Client Secret with the new value.
- Click Save.
- Test login immediately to confirm the new secret works.
- Once verified, you can revoke the old secret in your provider (optional grace period).
The old secret remains valid until you explicitly revoke it in your provider. Plexicus uses only the most recent secret you provide.
Break-Glass Emergency Admin Recovery
If SSO is misconfigured and admins cannot log in, use break-glass access to regain control.
SaaS Break-Glass Recovery
- On the login page, click Cannot access your account?.
- Enter an admin email and complete the password recovery flow.
- Set a temporary password and log in.
- Go to Settings → Authentication → SSO and fix the misconfiguration.
- Once fixed, re-enable SSO.
If step 1 is unavailable or SSO Enforced is blocking all logins, contact Plexicus support at support@plexicus.ai with:
- Organization email
- Proof of admin access
- Description of the issue
Self-Hosted Break-Glass Recovery
Self-hosted deployments have a dedicated break-glass mechanism using Helm secrets:
helm upgrade plexicus ./helm-chart \
--set global.required.secrets.breakGlassSecretKey="your-secret-key"
To use break-glass:
- Access your Kubernetes cluster where Plexicus is running.
- Retrieve the break-glass secret from your Helm values or Kubernetes secrets:
kubectl get secret plexicus-secrets -o jsonpath='{.data.sso-break-glass-secret}' | base64 -d - Visit the break-glass endpoint (internal use only):
POST https://<your-plexicus-domain>/internal/sso/break-glass/{client_id}
X-Break-Glass-Secret: <secret-key> - This generates a temporary admin token granting access to Settings → Authentication → SSO.
- Fix the configuration and re-enable SSO.
Never share the break-glass secret. Treat it like a root password and store it in your secrets manager.
Troubleshooting & Error Reference
SSO Login Errors
"SSO not available" (HTTP 404)
Cause: The organization slug is incorrect, SSO is not configured, or SSO is not activated.
Resolution:
- Verify the login URL slug matches your organization (e.g.,
https://app.plexicus.ai/?sso-slug=your-org). - In Settings → Authentication → SSO, confirm SSO is in one of these states:
- Configured & Activated (SAML or OIDC tab shows active configuration)
- Not in "Draft" state
- If slug is custom, ensure it matches exactly (case-sensitive).
- Check Settings → Organization → Audit Log for recent SSO configuration changes.
Note: For security, Plexicus returns the same 404 error whether the slug doesn't exist or SSO isn't configured — preventing tenant enumeration attacks.
SAML Errors
Error: "SAML signature validation failed" or "Invalid assertion signature"
Cause: The IdP's certificate doesn't match, is expired, or the assertion isn't signed.
Resolution:
- Verify the IdP X.509 Certificate in Settings → Authentication → SSO → Advanced Settings:
- Should be in PEM format (starts with
-----BEGIN CERTIFICATE-----) - Not DER or P12 format
- Not expired (check certificate validity:
openssl x509 -in cert.pem -noout -dates)
- Should be in PEM format (starts with
- Check IdP configuration:
- Ensure Sign Assertions is enabled (not just sign responses)
- Verify Plexicus ACS URL matches IdP settings exactly
- Clock skew: Both IdP and Plexicus servers must have accurate time (NTP sync):
ntpdate -q <ntp-server>to check Plexicus time- Check IdP time in admin console
- Plexicus allows ±120 seconds drift; increase if needed via
SAML_CLOCK_SKEW_SECONDSenv var
For Okta: Download the latest certificate from Applications → App → Sign On → SAML Signing Certificates.
For Azure AD: Download the latest certificate from Single sign-on → SAML Signing Certificate → Certificate (Base64).
Error: "SAML assertion already consumed" (HTTP 400)
Cause: Replay attack detected. The same assertion was used twice.
Resolution:
- This is a security feature (deduplication). Normally shouldn't occur in production.
- Clear the browser's cookies and try logging in again.
- If the error persists, contact Plexicus support.
Error: "Cannot deduplicate IdP-initiated assertion: missing identifier" (HTTP 400)
Cause: IdP-initiated SAML login (from IdP portal) is missing the assertion message ID.
Resolution:
- Ensure your IdP is sending message ID in SAML assertions.
- For Okta: Verify the SAML app configuration has correct binding settings.
- For Azure AD: Ensure the SAML app is sending signed assertions with IDs.
- Test SP-initiated flow instead: Direct users to your login page (not IdP portal).
Error: "Link token not found or expired" or "Link token payload invalid" (HTTP 404 / 400)
Cause: Account linking session expired or token corrupted.
Resolution:
- Account linking tokens are valid for 15 minutes.
- Start the linking process again: Settings → Authentication → SSO → Link Account.
- If error persists, clear cookies and retry.
OIDC Errors
Error: "OIDC state mismatch" or "OIDC state not found or expired" (HTTP 400)
Cause:
- OIDC state parameter doesn't match (CSRF defense)
- Session expired (10-minute window)
- Cookies were cleared between redirect and callback
Resolution:
- Clear all cookies for
api.plexicus.aiand try again. - Verify the Redirect URI in your OIDC provider exactly matches:
(No trailing slash, exact case, exact slug)
https://api.plexicus.ai/auth/sso/{client_slug}/oidc/callback - Check browser console (F12 → Network → look for callback request):
- Confirm
stateparameter is present in callback URL - Confirm it's a valid UUID/base64 string
- Confirm
- If using Redis, verify Redis connectivity (shown in Plexicus logs).
- PKCE is always enabled for security; cannot be disabled.
Error: "Invalid ID token" or "ID token validation failed" (HTTP 401)
Cause: ID token signature is invalid, expired, or claims are malformed.
Resolution:
- Verify Discovery URL is correct and accessible:
- For Okta:
https://<your-domain>.okta.com/.well-known/openid-configuration - For Azure:
https://login.microsoftonline.com/{tenant_id}/.well-known/openid-configuration - Test in browser to confirm it returns JSON with signing keys.
- For Okta:
- Verify Client ID and Client Secret are correct (copy from IdP, no extra spaces).
- Check token expiration (ID tokens are typically valid for 1 hour).
- Verify the IdP's signing certificate is up-to-date.
User Provisioning Errors
Error: "User not found" or "User provisioning failed" at login
Cause:
- Email attribute is missing or malformed
- JIT provisioning is disabled but user doesn't exist in Plexicus
- Email attribute doesn't match Attribute Mapping settings
Resolution:
- Check Attribute Mapping in Settings → Authentication → SSO → Advanced Settings:
- Verify Email is mapped to the correct claim/attribute from your IdP
- Example: If Okta sends
mail, notemail, update the mapping
- Verify IdP is sending the email attribute in the SAML/OIDC response:
- For Okta: In app Attribute Statements, ensure
email→user.email - For Azure: In app User Attributes & Claims, ensure email claim is present
- For OIDC: Verify
emailis in thescopesand returned in ID token
- For Okta: In app Attribute Statements, ensure
- Check that email value is a valid format (not null, empty, or malformed).
- If JIT is disabled, pre-create users in Settings → Organization → Team or enable JIT.
Error: "SCIM user creation failed" or "422 Unprocessable Entity" (SCIM)
Cause: SCIM user payload is malformed or required fields are missing.
Resolution:
- Verify SCIM token is valid and not expired:
- Go to Settings → Authentication → SSO → SCIM Tokens
- Check Expiration date
- Rotate if near expiry
- Check IdP's SCIM attribute mappings:
emailmust be present and validgivenNameandfamilyNameshould be mapped (optional but recommended)
- Verify IdP SCIM request includes required SCIM schema:
schemas: ["urn:ietf:params:scim:schemas:core:2.0:User"]
- Check Plexicus logs for detailed SCIM error:
kubectl logs -f <plexicus-pod> | grep scim(self-hosted)
Configuration Validation Errors
Error: "Validation failed: Certificate not found" or "Invalid metadata URL"
Cause: Metadata URL is unreachable or certificate is malformed.
Resolution:
- Test metadata URL in browser:
curl https://your-idp/.well-known/openid-configuration(OIDC)- Verify it returns valid JSON
- Ensure certificate is in valid PEM format:
- Starts with
-----BEGIN CERTIFICATE----- - Ends with
-----END CERTIFICATE----- - No extra whitespace or characters
- If copied from IdP UI, check for HTML entities like
<or>
- Starts with
- For self-hosted, verify DNS/firewall allows outbound HTTPS to IdP.
SSO Mode Errors
Error: "Cannot enable SSO Enforced without a successful validation"
Cause: Dry-run validation hasn't been completed or is older than 24 hours.
Resolution:
- Go to Settings → Authentication → SSO → Validate Configuration.
- Review the validation report — fix any errors or warnings.
- Once validation passes, the Activate as Enforced button becomes available.
- Enforce mode requires a validation within the last 24 hours — periodically re-validate.
Self-Hosted Specific Errors
Error: "Break-glass secret invalid" (self-hosted)
Cause: The break-glass secret doesn't match what's configured in Helm.
Resolution:
- Verify the secret was set during Helm install:
kubectl get secret plexicus-sso -o jsonpath='{.data.break-glass-secret}' | base64 -d - Ensure the
X-Break-Glass-Secretheader in the break-glass request matches exactly. - If lost, re-run Helm install/upgrade with the secret.
Getting Help
If none of the above resolve your issue:
-
Check Plexicus Logs:
- SaaS: Contact Plexicus support
- Self-Hosted:
kubectl logs -f deployment/plexicus-fastapi | grep -i sso
-
Gather Diagnostic Info:
- SSO protocol (SAML or OIDC)
- Identity provider name and version
- SSO mode (Coexist/Preferred/Enforced)
- Last configuration change (from Audit Log)
- Exact error message and HTTP status code
-
Contact Plexicus Support:
- Email:
support@plexicus.ai - Include the diagnostic info above
- For SAML: Attach an anonymized SAML assertion (remove user data)
- Email:
Best Practices
- Test SSO before enforcement: Use Coexist mode first, then graduate to SSO Preferred or SSO Enforced.
- Distribute the login slug: Share your custom SSO login slug (e.g.,
your-company.plexicus.ai) with your team. - Rotate certificates proactively: Don't wait for IdP certificate expiration; rotate preemptively.
- Use group-role mapping: Auto-assign roles via IdP groups to reduce manual team management overhead.
- Monitor audit logs: Check Settings → Organization → Audit Log for SSO configuration changes.
SaaS vs Self-Hosted Differences
| Feature | SaaS | Self-Hosted |
|---|---|---|
| SAML 2.0 | ✅ Yes | ✅ Yes |
| OIDC | ✅ Yes | ✅ Yes |
| SCIM Provisioning | Scale+ plan | Included |
| Custom Slug | ✅ Yes | ✅ Yes |
| Certificate Rotation | ✅ Yes | ✅ Yes |
| Break-Glass Recovery | Admin only | Via secrets |
Next Steps
- Manage team members and roles
- Enable two-factor authentication (additional security layer)
- Configure your profile