Single sign-on overview
Connect your existing directory so that access to Seylo is granted where you already grant everything else, and revoked the same way.
Supported providers
Section titled “Supported providers”Before you start
Section titled “Before you start”| You need | Why |
|---|---|
admin in Seylo |
SSO configuration is administrator-only |
| Administrative access to your directory | You will create an app registration and, usually, add a claim |
| To know how your roles are expressed | Groups? App roles? A custom claim? This is the part that goes wrong |
Configuration lives under Single sign-on in the portal.
The one concept to understand first: the tenant key
Section titled “The one concept to understand first: the tenant key”Seylo identifies your organisation from the token’s issuer, plus — where the issuer is not unique to you — a discriminator claim.
That second part exists for one reason: Entra ID gives every directory its own
issuer, but Google Workspace gives every organisation on earth the same
issuer, https://accounts.google.com. The issuer alone cannot tell your
Workspace from anyone else’s.
| Provider | Discriminator | Required? |
|---|---|---|
| Entra ID, single directory | — | No. The issuer already embeds your directory ID |
| Entra ID, multi-tenant app | tid |
Recommended |
| Google Workspace | hd |
Yes |
| Okta | — | No. One issuer per org or authorization server |
| Auth0 without Organizations | — | No |
| Auth0 with Organizations | org_id |
Recommended |
| Keycloak | — | No. One issuer per realm |
Three behaviours follow, and all three are deliberate:
- No discriminator configured → the issuer alone resolves your organisation.
- Configured but absent from the token → rejected. Never “try the other
organisations”, never “use the default”. A Google token with no
hdis a personal Gmail account and must not land in a Workspace organisation. - Present but unmatched → rejected, naming the claim and the value that arrived. It never falls through to another organisation sharing the issuer, and the message names no other organisation.
What Seylo enforces on every sign-in
Section titled “What Seylo enforces on every sign-in”You do not configure any of this; it is worth knowing it is there.
- Signature verified against that issuer’s published keys, fetched over https from a discovery document that must declare the issuer it was served from.
- Only asymmetric algorithms.
HS256andnoneare refused — withHS*the signing key is the client secret, which is not a signature in any useful sense. - Audience checked against your registered audiences; expiry and not-before enforced.
- An unknown issuer is a 401, never a fallback to some default organisation.
- An
(issuer, discriminator)pair already owned by another organisation cannot be taken over. Moving one is an explicit delete then add, because a registration is a trust anchor.
For SAML, signature validation uses @node-saml/node-saml rather than
hand-rolled XML handling: it verifies the bytes the signature actually covered
(which is what defeats signature-wrapping attacks) and validates only against
the certificate you configured — never one embedded in the received document.
Recommended order
Section titled “Recommended order”- Register Seylo in your directory and configure the provider here.
- Run test login before telling anyone it works. It shows the complete claim set and says, per value, whether each role mapped and why not.
- Set up role mapping.
- Close self-service signup — see managing users.
- Read break-glass recovery before you need it.