Required for the site to work (login, preferences, security). Always on.
Tenant isolation for MSPs: a tenant ID or a login is not authorization
A client-supplied tenant ID, header or login only tells a multi-tenant platform who to look at. Membership must be re-verified server-side, on every request, at sign-in and at offboarding.
In this article
- A tenant ID only selects a customer, it does not authorize one
- An X-Tenant-ID header or body field carries the same trap
- Signing in proves who — not which tenant they may touch
- Conditional Access secures the sign-in, not the data path
- SSO gets people in; only SCIM gets leavers out
- Disabling the account does not end the session or the token
- What to do
A client-supplied tenant ID, an X-Tenant-ID header, a working login, a Conditional Access policy or an SSO connection each tell a multi-tenant platform something useful — but none of them, on their own, prove that the caller is allowed to see a given customer's data. This guide is for MSPs and IT teams who run or buy multi-tenant platforms: it sets out, mechanism by mechanism, where a server-side authorization check actually has to sit, from the first request to the day an account is offboarded.

A tenant ID only selects a customer, it does not authorize one
A tenant ID supplied by the client — in a request body, a query parameter, or resolved from a subdomain — is a selector. It tells the application which customer's context to open. The OWASP Multi-Tenant Security Cheat Sheet sets out the underlying rule: bind every request to an authenticated principal, resolve that principal's tenant membership from server-side state, enforce object-level checks inside the tenant, and keep admin or break-glass paths separate from ordinary tenant access. That check has to run everywhere a tenant boundary matters, not only at the API's front door: on reads and writes, on administrative actions, and on background jobs that pick up work after the original request has finished. A queue-triggered job that inherits a tenant ID from a message, without re-verifying it, reopens exactly the gap the original check was meant to close.
An X-Tenant-ID header or body field carries the same trap
The same mistake shows up wearing a header's name. Multi-tenant APIs commonly accept an X-Tenant-ID header or a tenant field in the request body to pick which customer's data a call should touch, and it is tempting to treat that value as sufficient once it parses correctly. OWASP's guidance flags two related pitfalls: assuming a tenant identifier is safe because it is long or hard to guess, instead of running an actual authorization check; and letting an otherwise tenant-scoped code path silently fall back to an unscoped query when the expected value is missing or malformed. Either failure lets a caller who is authenticated, but not a member of the requested tenant, reach data that belongs to somebody else.
Signing in proves who — not which tenant they may touch
Authentication answers a different question than isolation does. NIST Special Publication 800-210, on access control for cloud systems, treats tenant isolation as a property the platform itself must enforce on every API and data path when one software instance serves many tenants, because the customer using the service does not control the underlying infrastructure. AWS's Well-Architected SaaS Lens describes two ways vendors build this: in a “silo” model each tenant gets dedicated resources and a scoped execution role, simpler to reason about but harder to run at scale; in a “pool” model tenants share infrastructure and isolation must be enforced inside the application logic on every request. Neither model is inherently safer. What matters is whether a vendor can show, concretely, how a request gets bound to the caller's own tenant before any data is touched, not that the caller has a working login.
Conditional Access secures the sign-in, not the data path
Microsoft describes Conditional Access as a Zero Trust policy engine built on if-then logic: if a user, or increasingly an AI agent, tries to reach a resource, then a condition such as device compliance, sign-in risk or location must be satisfied first. That is a genuinely useful gate — it can stop a compromised credential from starting a session, or cut off a session that starts behaving suspiciously. But it has no visibility into how an application's own backend decides, once a session exists, which customer's records a given API call is allowed to read or write. If a platform trusts a client-supplied tenant value to make that decision, Conditional Access has already finished its job, successfully and irrelevantly, by the time the decision is made. A well-configured sign-in gate in front of a poorly isolated API produces the same leak it would produce without the gate. Microsoft's Agent 365 licensing is extending Conditional Access to AI agents, but the same distinction between sign-in and data access still applies there.
SSO gets people in; only SCIM gets leavers out
Federation answers “who may sign in right now?” The System for Cross-domain Identity Management, standardized as RFC 7644, answers a different question: which accounts should still exist at all. Microsoft's SCIM provisioning documentation describes the usual flow: a soft-delete in the identity provider sets a user resource's active attribute to false, and the receiving application is expected to disable or archive that seat in response. Without a SCIM integration, a leaver's single sign-on stops working, but their seat, and any residual API access tied to it, can persist untouched. The provisioning side needs its own scoping too: a SCIM bearer token should be issued per customer tenant and accepted only at that tenant's own SCIM endpoint. Sharing one multi-tenant SCIM secret across customers turns a single leaked token into a cross-customer deprovisioning and account-takeover risk.
Disabling the account does not end the session or the token
When someone leaves and an admin disables their identity-provider account, it is easy to assume the job is done. Microsoft's own guidance on revoking access says otherwise: disabling an account blocks new sign-ins but does not automatically invalidate refresh tokens, active sessions or browser cookies already issued. Cutting real access means separately revoking sessions and tokens and clearing cached credentials, and, where it is available, Continuous Access Evaluation enforces the cut-off faster than waiting for a token to expire on its own. NIST's draft session-management guidance makes a related point: possessing a valid access token is not proof a session is still legitimately open, and identity-provider sessions and application sessions are independent of each other, so ending one does not end the other. That is why OWASP's Session Management Cheat Sheet calls for server-side session invalidation with both idle and absolute timeouts, instead of relying on the client to discard credentials.
Some MSPs would rather hand this control-plane work to a dedicated provider than build and audit it themselves; Auris is a European IAM-as-a-Service platform for adaptive MFA, federated SSO and immutable audit trails.
What to do
- Resolve tenant membership from server-side identity data on every request; never trust a client-supplied ID, header or body field on its own.
- Enforce that check on every path a tenant boundary touches: reads, writes, admin actions, and background or queue-triggered jobs.
- Reject any tenant selector that has not been confirmed against the authenticated caller's actual memberships, instead of assuming a long identifier is safe.
- Treat Conditional Access, SSO and tenant-binding as separate controls with separate failure modes, and test each one on its own.
- Wire up SCIM alongside SSO, scope every SCIM token to one tenant, and confirm a leaver's account is disabled at the source system, not only at the identity provider.
- On offboarding, explicitly revoke sessions and refresh tokens across every application the person touched, rather than stopping at “account disabled.”
Sources: OWASP Multi Tenant Security Cheat Sheet, NIST SP 800-210, AWS Well-Architected SaaS Lens, Microsoft Learn — Conditional Access overview, Microsoft Learn — Use SCIM to provision users and groups, OWASP Session Management Cheat Sheet.