Skip to main content

SSO Troubleshooting

Two surfaces produce SSO errors, and they behave differently on purpose.
  • The sign-in path/saml/<slug>/login, /saml/<slug>/acs, /saml/<slug>/slo — is public and unauthenticated. Anyone who knows a workspace slug can reach it. So its answers are deliberately uninformative: the person is sent to the login page with a short error code, and the reason lives in your workspace’s audit and security events, where only an administrator can read it. A public endpoint that explained itself would explain itself to anybody.
  • The settings form — everything under /admin/saml — is behind the owner-or-admin role and a recent re-authentication, so it says exactly what is wrong with the value you typed. Those messages are quoted verbatim below.
Start here for almost everything. Most first-login failures are one of three things: the audience does not match (KnoxCall’s SP entity ID is its metadata URL, https://acme.knoxcall.com/saml/acme/metadata, not the origin), the assertion is older than five minutes, or the asserted address is at a domain the workspace has not proven. Those /saml/<workspace>/… URLs are the default connection’s — the /saml/ alias is that connection. Any other connection has its own set at https://acme.knoxcall.com/sso/<workspace>/<connection>/{metadata,acs,login,slo}, so check the one you are debugging on its Certificates tab before comparing anything. Fetch your own metadata document and compare it against what your IdP has, before anything else.

Error codes on the login path

The code arrives as ?error=<code> on the login page, or as a JSON { "error": "<code>" } from the metadata and logout endpoints.

What is really behind saml_failed

The assertion verified, and then an account rule refused it. The person sees saml_failed; you see one of these in the workspace’s events. All six are quoted verbatim. There is a seventh, for a misconfigured connection rather than a person: if the connection’s default role is anything an IdP-asserted login may not confer, every login fails cleanly with a message naming the role and telling you to lower it. That state is unreachable through the settings form, which refuses the value at save time.

Refusals from the SSO settings form

These come back as a 400 with the message shown to you directly. Fix the value and save again.

The IdP sign-in URL and the single-logout URL

Both are dereferenced — a browser is sent to them — so both are held to the same rule. The IdP entity ID is not held to any of this: it is a name, not an address, nothing dereferences it, and Okta’s genuinely begins http://www.okta.com/. It is checked only for length and control characters.

The signing certificate

A bare base64 body is fine; so is full PEM. KnoxCall normalises what you paste and stores the PEM form. Expiry is deliberately not refused — refusing to save a config whose certificate expires next week would block the very edit that fixes it.

Roles, domains and the rest

Saving also needs a re-authentication in the last five minutes. A 403 asking you to re-authenticate is that, not a permissions problem — it is the same bar as changing a password, because this row names the identity provider allowed to assert who your users are.

Refusals from the IdP metadata import

POST /admin/saml/connections/<id>/metadata reads your identity provider’s federation metadata; the flow is importing your IdP’s metadata. Every refusal below is decided before anything is written, and each carries a machine-readable code alongside the message.
An import never clears what the document does not carry. A metadata export made before you switched Single Logout on has no SingleLogoutService, and KnoxCall leaves your stored SLO URL exactly where it was rather than reading the absence as “turn it off”. It never retires a certificate either — rotation stays add-first — and it does not touch the domain list.

Symptoms with no error code

Everything worked, then every login started failing at once. The IdP rotated its signing certificate. Add the new one to the connection — rotation, with overlap. Logins fail only for people who have never signed in before. The account rules, not the assertion: check the connection’s verified email domains and whether just-in-time provisioning is on. Everyone lands with the wrong role. Group mapping decides the role a person gets when they are first added. Moving someone between groups in your IdP later does not change their KnoxCall role — change it on the team page. Sign-in works from KnoxCall but not from the IdP’s app tile. That tile is an IdP-initiated login. Point it at https://acme.knoxcall.com/saml/acme/login instead, which is the better answer anyway. Repeated attempts start failing. The ACS and the SLO endpoint each accept 30 requests per minute per workspace and source address, with separate budgets so a logout storm cannot spend your sign-in allowance. Wait a minute. Assertion encryption is not offered by the IdP at all. The app was configured from SP metadata that predates our encryption key. Re-upload the metadata — this is the 8 September 2026 call-out on every guide.

Still stuck

Collect these before contacting support — they are what makes a report actionable, and none of them is a secret:
  • your workspace slug and the URL you signed in from;
  • the error= code on the login page, and roughly when;
  • your IdP’s SAML tracer output, if you can capture one (Entra, Okta and JumpCloud all have one; browser extensions work everywhere);
  • the SP metadata document your IdP currently holds, so it can be diffed against https://acme.knoxcall.com/saml/acme/metadata.
Do not send a private key. KnoxCall never needs one from you.