Seventh Sense
Features

SenseCrypt
Technical library

Tenancy

Separate tenants. Separate signing keys.

Each tenant has its own hostname, OIDC issuer, SAML identity provider and signing keys. Verify tenant boundaries by testing issuers, audiences and keys across tenants.

6 sectionsSeventh Sense / SenseCrypt
On this page

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

What belongs to a tenant
Per tenantDetail
Issuer and hostnameDerived from the tenant's immutable slug, and the base for discovery, the key set, OIDC, SAML and SCIM
OIDC signing keyES256 on a P-256 key whose kid is its RFC 7638 thumbprint, rotatable with a grace window
SAML signing keyRSA-2048 with a self-signed certificate, rotated make-before-break through the metadata
Users and groupsEvery user belongs to exactly one tenant, and a face enrollment is scoped to that tenant
ApplicationsRegistrations do not travel: the same client id presented on a second tenant's issuer host is unknown there
Roles, permissions and resource serversDefined per tenant, so two customers' administrator roles are unrelated to each other
RecordsAdministrative actions in a hash-chained log, end-user sign-ins in a separate read-only stream
Custom domainOptional 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.

Next step

The next level of detail depends on your stack, so the fastest route is a conversation.