01
One tenant, one issuer, one hostname
A tenant has a globally unique slug, and its issuer lives at a hostname derived from it. That URL is the OIDC issuer value and the base for everything the tenant serves: discovery, the key set, authorize, token, userinfo, SAML metadata, SAML sign-on and SCIM. The tenant is resolved from the host a request arrived on.
The slug is immutable after creation, because it is baked into the issuer URL every relying party trusts; renaming it would break each of them. A tenant's human-readable display name can be changed freely. Common infrastructure labels are reserved and refused.
The practical consequence for a relying party is that the unit of integration is a tenant, never the platform as a whole. Resolve endpoints from that tenant's own discovery document, read the issuer claim to learn which tenant minted a token, and verify the signature against the key set published at that issuer.
Each tenant has its own signing key
IdP retains encrypted tenant signing keys. OIDC tokens use ES256 on P-256, with an RFC 7638 thumbprint as the key ID. SAML assertions use a separate RSA-2048 key and self-signed certificate. Both key sets are created with the tenant and can be rotated.
Key rotation designed for continuity
OIDC rotation inserts a new signer and keeps the outgoing key verifying through a grace window, so the key set legitimately holds more than one key. SAML publishes a new certificate in metadata before it starts signing.
Protect tenant signing keys
IdP retains encrypted tenant signing keys, protected under the configured custody model. Its OIDC federation uses classical ES256, with public keys published for verification. Unlike PKI face operations, IdP tenant signing does not require regenerating a private key from a live biometric.
A face enrollment belongs to one tenant
The same person enrolls separately in each tenant. A sealed face token is bound to a single tenant identifier and fails closed if it is replayed against another.
02
What isolation means in practice
Every user, application, group, role, resource server, scope and signing key belongs to exactly one tenant. The constraint is attached to the query itself: each read is narrowed to the account and tenant that authenticated the request, before any result exists to be filtered. Removing an option from a menu is a change to a screen, and we do not describe that as isolation.
Ask for an object belonging to another tenant and the answer is a not-found, not a refusal. Treating those two responses as interchangeable is the mistake that lets an attacker walk an identifier space and come away with a list of your customers, which is why the boundary refuses to confirm that anything is there at all.
Cryptography stands behind the query scoping. A client registered in one tenant is refused on another tenant's issuer host, and a token minted in one tenant cannot verify against another's key set at all, so an application bug cannot quietly become a path between two customers.
Tenants define the isolation boundary
One account can hold many tenants, and two tenants under the same account are as isolated from each other as two under different accounts: separate issuers, separate keys, separate directories.
Define roles and permissions per tenant
Role and permission names live inside a tenant, so two customers are free to define the same name for entirely different things. Nobody has to agree a naming scheme across your whole customer base, and nobody can break another tenant by choosing badly.
Limit permission errors to one tenant
When a customer's operator hands out more than they should, the reach of the mistake is that customer and no further. The limit comes from the construction of the boundary rather than from review catching the change in time.
Records stay inside the boundary
Administrative actions are recorded per tenant in a hash-chained, tamper-evident log, and end-user sign-in activity is a separate read-only stream, also per tenant. Handing a customer their own history takes no filtering step to keep the next customer's events from appearing in it.
03
What your application must configure
If you serve many customers from one deployment, the tenant becomes the unit of onboarding. Taking on a new customer means creating a tenant rather than standing up infrastructure, and every account starts with one default tenant that cannot be deleted.
If your code touches more than one tenant, treat each as a fully separate identity provider: its own issuer, its own key set, its own client registrations. Nothing from one is usable in another, so cache per issuer and avoid hard-coding a hostname or a path beyond the issuer base.
Customers can also federate on their own terms. One customer can push users from their own directory over SCIM while the next manages people by hand in the console, and one can connect over SAML while another uses OIDC. The boundary is what makes that a per-customer choice instead of a platform-wide decision.
04
The user experience
Inside every tenant the sign-in is the same live face ceremony, and at no point does it involve a password or a one-time code. In business software that removes the habit small teams drift into, where a single login circulates quietly around a department because nothing stops it.
A tenant can serve that sign-in under its own verified custom domain, so the people signing in see a hostname that belongs to the product they are using rather than to a vendor they have never heard of.
Because there is no identity provider side SSO session for end-user authentication, somebody who works across two of your customers authenticates in each one, and enrollment is per tenant as well. That is the cost of a boundary that holds, and it is a cost worth naming before a design is committed.
No shared login to circulate
Account sharing needs an object to share, and here there is not one to pass along. It rarely reaches a risk register and it happens constantly in small teams, so removing the thing being passed around is more reliable than a policy asking people to stop.
Each customer's directory stays theirs
Provisioning, group membership and role conferral all happen inside the tenant, so a customer runs their own joiner and leaver process without you brokering it.
Start with two tenants on the trial
No card is needed for the 30-day trial. Stand up a second tenant and test the boundary yourself before the design is settled.
05
Compare the details
| Per tenant | Detail |
|---|---|
| Issuer and hostname | Derived from the tenant's immutable slug, and the base for discovery, the key set, OIDC, SAML and SCIM |
| OIDC signing key | ES256 on a P-256 key whose kid is its RFC 7638 thumbprint, rotatable with a grace window |
| SAML signing key | RSA-2048 with a self-signed certificate, rotated make-before-break through the metadata |
| Users and groups | Every user belongs to exactly one tenant, and a face enrollment is scoped to that tenant |
| Applications | Registrations do not travel: the same client id presented on a second tenant's issuer host is unknown there |
| Roles, permissions and resource servers | Defined per tenant, so two customers' administrator roles are unrelated to each other |
| Records | Administrative actions in a hash-chained log, end-user sign-ins in a separate read-only stream |
| Custom domain | Optional per tenant, so sign-in happens on a hostname the customer owns |
Issuer and hostname
- Detail
- Derived from the tenant's immutable slug, and the base for discovery, the key set, OIDC, SAML and SCIM
OIDC signing key
- Detail
- ES256 on a P-256 key whose kid is its RFC 7638 thumbprint, rotatable with a grace window
SAML signing key
- Detail
- RSA-2048 with a self-signed certificate, rotated make-before-break through the metadata
Users and groups
- Detail
- Every user belongs to exactly one tenant, and a face enrollment is scoped to that tenant
Applications
- Detail
- Registrations do not travel: the same client id presented on a second tenant's issuer host is unknown there
Roles, permissions and resource servers
- Detail
- Defined per tenant, so two customers' administrator roles are unrelated to each other
Records
- Detail
- Administrative actions in a hash-chained log, end-user sign-ins in a separate read-only stream
Custom domain
- Detail
- Optional per tenant, so sign-in happens on a hostname the customer owns
06
Frequently asked questions
How is one tenant isolated from another?
At three layers. Queries are constrained to the account and tenant that authenticated, a lookup of another tenant's object comes back as a not-found rather than as a refusal, and every tenant signs with its own keys, so a token minted in one tenant cannot verify against another tenant's key set at all.
Can two tenants under the same account see each other?
No. The account owns billing, administrators and the tenants themselves, but the tenant is the isolation boundary. Two tenants under one account have separate issuers, separate keys and separate directories, exactly like two tenants under different accounts.
Do our users enroll once for all tenants?
No, enrollment happens once per tenant. The sealed token carries the identifier of the tenant it was created in, so presenting it anywhere else fails rather than degrading into a partial match. A person who works with two of your customers therefore goes through enrollment twice, once inside each boundary.
Can each customer use their own domain?
Yes. A tenant can serve its sign-in on a verified custom domain, which is what most business products want so their customers stay on a familiar hostname. Three are included with the platform, and every further domain adds ten dollars a month.
How many tenants are included?
Three come with the platform, and each further tenant adds ten dollars a month on top of the seat rate, which is one dollar per user each month at list with a floor of 20 seats. If you plan a tenant per customer at scale, model that line explicitly rather than treating it as a rounding error.
How do we tell which tenant issued a token?
Read the issuer claim and verify the token against the key set published at that issuer. Because each tenant signs with its own key, the issuer plus a successful signature check is a reliable answer rather than a statement you have to take on trust.