| Internet-Draft | Tenant-Aware SCIM | August 2026 |
| Kushwaha | Expires 26 February 2027 | [Page] |
This document defines a System for Cross-domain Identity Management (SCIM) extension for tenant-aware identity provisioning. The extension introduces a "Tenant" resource type, tenant-membership extensions for the "User" and "Group" resources, a lifecycle state machine for tenants and memberships, tenant-scoped uniqueness discovery, a normative tenant-context resolution rule built around the highest-precedence authenticated indicator together with a stated tenant-binding invariant, concurrency requirements for membership mutation, tenant-aware filtering, and an OPTIONAL region-aware metadata profile. The extension is backward compatible with SCIM 2.0 and is intended for multi-tenant Software as a Service (SaaS), cloud identity, business-to-business identity, identity governance, and multi-region identity deployments. Scoped role and entitlement bindings are delegated to the SCIM Roles and Entitlements and RoleAssignment work rather than redefined here.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 26 February 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
The System for Cross-domain Identity Management (SCIM) 2.0 [RFC7643] [RFC7644] standardizes provisioning of identity resources between an identity provider and a service provider. SCIM defines "User" and "Group" resource types, an extension mechanism based on schema URIs, and a protocol with endpoints for resource discovery and lifecycle. SCIM resources are represented in JSON [RFC8259].¶
SCIM does not define a portable "Tenant" resource. [RFC7644], Section 1.1 acknowledges that a service provider may be multi-tenant and lists deployment techniques for conveying tenant context (URL prefix, subdomain, HTTP header, authentication context), but does not specify a "Tenant" resource type, a tenant-membership schema, a tenant-scoped uniqueness model, a tenant lifecycle model, or a normative rule for resolving tenant context when more than one tenant indicator is present and the indicators disagree. The SCIM use cases [I-D.ietf-scim-use-cases-reloaded] describe multi-tenant deployment topologies but likewise do not define an on-the-wire tenant resource or a context-resolution rule.¶
In practice, each identity platform fills the gap proprietarily. The same logical concept (tenant, organization, identity domain, workspace, customer account) is therefore not portable across SCIM endpoints. In zero-trust deployments [NIST-SP-800-207], where authorization is evaluated continuously, an ambiguous or stale tenant context is itself a security liability, which raises the importance of a precise tenant-resolution rule. This document proposes a backward-compatible SCIM 2.0 extension that closes this gap.¶
The contribution of this document is the portability of the tenant concept through SCIM and the precise, security-relevant rules that govern it: a tenant resource and membership model, a context-resolution rule with a stated invariant, a lifecycle state machine, and a tenant-scoped uniqueness model. This document does not invent tenancy and does not require identity platforms to abandon their internal representations; it defines a vendor-neutral abstraction layer.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
The following terms are used throughout the document:¶
This document defines four SCIM schema URIs:¶
urn:ietf:params:scim:schemas:core:2.0:Tenant urn:ietf:params:scim:schemas:extension:tenantMembership:2.0:User urn:ietf:params:scim:schemas:extension:tenantMembership:2.0:Group urn:ietf:params:scim:schemas:extension:multiTenancy:2.0:ServiceProviderConfig¶
The Tenant resource is a new resource type and therefore uses a primary schema URI in the "core" namespace, consistent with [RFC7643], Section 10 and with the convention adopted by other new SCIM resource types. The two membership schemas extend existing resource types and therefore use the "extension" namespace. These URIs are requested for registration in the IANA "SCIM Schema URIs" registry; see Section 17.¶
A Tenant resource is exposed at the SCIM endpoint "/Tenants".¶
A service provider implementing this extension SHALL support the following endpoints with the semantics defined in [RFC7644]:¶
GET /Tenants (list/search)
GET /Tenants/{id} (read)
POST /Tenants (create)
PUT /Tenants/{id} (replace)
PATCH /Tenants/{id} (modify)
DELETE /Tenants/{id} (delete; see lifecycle rules)
¶
The Tenant resource has the following attributes. Each entry below follows [RFC7643], Section 2.2. Unless otherwise noted, the type is "string", "multiValued" is false, "required" is false, "caseExact" is false, "mutability" is "readWrite", "returned" is "default", and "uniqueness" is "none".¶
{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:Tenant"
],
"id": "tenant-acme",
"externalId": "customer-1001",
"displayName": "Acme Corporation",
"status": "active",
"type": "customer",
"domains": [
{"value": "acme.example.com", "primary": true, "verified": true}
],
"meta": {
"resourceType": "Tenant",
"version": "W/\"a330bc54f0671c9\"",
"location": "https://sp.example.com/scim/v2/Tenants/tenant-acme"
}
}
¶
The Tenant Membership extension for User is identified by the URI "urn:ietf:params:scim:schemas:extension:tenantMembership:2.0:User".¶
Complex multi-valued. ReadWrite. Each entry represents the user's relationship to one Tenant. Sub-attributes:¶
This object intentionally does NOT carry tenant-local "roles" or "entitlements". Scoped role and entitlement bindings are expressed using RoleAssignment [I-D.poreddy-scim-role-assignment] with a scope that references the Tenant "id", and the set of available roles and entitlements is discovered using [I-D.ietf-scim-roles-entitlements]. This avoids re-encoding scope into role strings and keeps a single interoperable mechanism for scoped authorization data. See Section 1.1.¶
A user's effective state in Tenant "t" is determined by composing the core user state, the tenant state, and the membership state, in this order:¶
{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User",
"urn:ietf:params:scim:schemas:extension:tenantMembership:2.0:User"
],
"id": "user-123",
"userName": "alex@example.com",
"active": true,
"urn:ietf:params:scim:schemas:extension:tenantMembership:2.0:User": {
"memberships": [
{
"value": "tenant-acme",
"$ref": "/Tenants/tenant-acme",
"status": "active",
"primary": true
},
{
"value": "tenant-contoso",
"$ref": "/Tenants/tenant-contoso",
"status": "suspended",
"primary": false
}
]
}
}
¶
The Tenant Membership extension for Group is identified by the URI "urn:ietf:params:scim:schemas:extension:tenantMembership:2.0:Group".¶
Tenant-scoped groups SHALL belong to exactly one Tenant. A client SHALL NOT create a Group with "scope = tenant" and no "value". Cross-tenant Group membership is not modeled; cross-tenant collaboration is expressed at the User level via multiple memberships.¶
A service provider implementing this extension SHALL advertise its tenant-related capabilities through "/ServiceProviderConfig", using the schema URI "urn:ietf:params:scim:schemas:extension:multiTenancy:2.0:ServiceProviderConfig".¶
Complex. Required. Mutability readOnly. Sub-attributes:¶
{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig",
"urn:ietf:params:scim:schemas:extension:multiTenancy:2.0:ServiceProviderConfig"
],
"urn:ietf:params:scim:schemas:extension:multiTenancy:2.0:ServiceProviderConfig": {
"multiTenancy": {
"supported": true,
"tenantResourceSupported": true,
"tenantMembershipSupported": true,
"tenantAwareFilteringSupported": true,
"tenantScopedUniquenessSupported": true,
"regionAwareTenancySupported": true,
"tenantSelectionMethods": [
"tokenClaim","path","header","subdomain","body"
],
"tenantSelectionPrecedence": [
"tokenClaim","path","header","subdomain","body"
],
"authenticatedSelectionMethods": ["tokenClaim"],
"tenantClaim": "tenant_id",
"tenantHeader": "SCIM-Tenant-Id",
"tenantScopedUniqueness": {
"userName": "tenant",
"externalId": "tenant",
"groupDisplayName": "tenant"
}
}
}
}
¶
This section defines a single rule that resolves a request to one effective Tenant "T*" and states the invariant the rule preserves. The rule subsumes both indicator precedence and indicator-conflict handling; the two are not independent mechanisms.¶
Let TI(q) be the set of present, canonicalized (Section 8.3) tenant indicators in request q, and let A(q) be the subset of TI(q) that the service provider treats as authenticated (by default, the access-token claim only; see "authenticatedSelectionMethods"). The service provider SHALL resolve and admit a request as follows:¶
T* = value of the highest-precedence element of A(q), if A(q) is
non-empty; otherwise the highest-precedence element of TI(q).
A request is ADMISSIBLE if and only if:
(1) the client is authorized for T*, AND
(2) for every indicator i in TI(q): canonicalize(i) = T*.
Tenant Binding Invariant:
For any operation that commits a state change, the effective tenant
equals T*, and the client holds an authorization grant for T*.
¶
Step (1) is the authorization gate. Step (2) is the cross-check that prevents a lower-precedence (possibly spoofable) indicator from silently redirecting the request. Because T* is taken from the highest-precedence authenticated indicator whenever one is present, effective context is never derived from a spoofable source when an authenticated indicator exists. Each rule preserves the invariant: derivation sets the effective tenant to T*; step (1) ensures authorization for T*; step (2) ensures no other indicator disagrees; and canonicalization (Section 8.3) ensures the comparisons in (2) are sound. Implementations SHALL evaluate the gate and cross-check in a way that does not leak tenant existence or authorization; see Section 15.5.¶
When a request is not admissible, the service provider SHALL respond as follows:¶
Because the 400 conflict response is reachable only after the authorization gate for T* has been passed, it does not act as an existence or authorization oracle for any other Tenant.¶
Before comparison under Section 8.1, each indicator is mapped to a Tenant "id" and normalized:¶
If an indicator cannot be mapped to a Tenant "id" (for example, an unrecognized subdomain), it is treated as not resolving to any Tenant; the request is then handled as in Section 8.2 with respect to T*.¶
A single client (for example, an identity-governance administrator) may be authorized for many Tenants under one access token. Such a token cannot name a single Tenant in "tenant_id". To support this case:¶
A service provider that consumes OAuth 2.0 [RFC6749] access tokens or JWT-profile access tokens [RFC9068] SHALL accept a JWT claim named "tenant_id" of type string. The claim value SHALL be the SCIM Tenant "id" the client asserts as the request's tenant context.¶
A service provider MAY additionally accept implementation-specific claims (for example, "tid" for compatibility with deployed ecosystems) and SHALL advertise the primary accepted claim in "ServiceProviderConfig.multiTenancy.tenantClaim". When multiple claims carrying tenant context are present in a single token, the claim named by "tenantClaim" SHALL take precedence.¶
When an HTTP header-field indicator is used, the canonical field name is "SCIM-Tenant-Id" and its value is the Tenant "id". The field name follows the structured-naming guidance of [RFC9110], Section 16.3.2 and is registered as a provisional HTTP field name; see Section 17. The header field is a tenant-context indicator only and, unless it is listed in "authenticatedSelectionMethods", SHALL NOT be treated as authenticated.¶
The default precedence is ["tokenClaim", "path", "header", "subdomain", "body"], reflecting that a signed access-token claim is cryptographically bound to the request through OAuth bearer presentation [RFC6750], while URL path, header, subdomain, and body are mutable by intermediaries or by the client. Implementations MAY alter the precedence per deployment. Any deviation from the default SHALL be reflected in "ServiceProviderConfig.multiTenancy.tenantSelectionPrecedence", and any deviation from the default authenticated set SHALL be reflected in "authenticatedSelectionMethods". A service provider SHALL NOT place an unauthenticated indicator ahead of an authenticated one in a way that would allow an unauthenticated indicator to determine T* while an authenticated indicator is present.¶
This section specifies the permissible states and transitions for the Tenant resource and for User memberships, and the cascade effects of Tenant transitions on memberships. Service providers SHALL reject transitions not listed here with HTTP 400 and "scimType = invalidValue".¶
| From | To | Effect |
|---|---|---|
| (create) | pending, active | Initial state on POST. |
| pending | active | Tenant becomes operational. |
| pending | archived | Abandoned before activation. |
| active | suspended | Members become inactive (Section 5.2); resources retained. |
| suspended | active | Members' effective state recomputed from membership status. |
| active, suspended | archived | Terminal-soft state; read-only; members inactive. |
| archived | (DELETE) | Permitted subject to Section 9.3. |
While a Tenant is "suspended" or "archived", the service provider SHALL reject state-changing operations on resources owned by that Tenant with HTTP 409 and "scimType = mutability", except operations that themselves transition the Tenant status.¶
| From | To | Notes |
|---|---|---|
| (create) | invited, pending, active | Initial state on membership add. |
| invited | pending, active, deactivated | Invitation accepted or withdrawn. |
| pending | active, deactivated | Provisioning completed or abandoned. |
| active | suspended, deactivated | Temporary or permanent removal of presence. |
| suspended | active, deactivated | Reinstatement or permanent removal. |
| deactivated | active | Re-activation; permitted only while the Tenant is "active". |
| (any) | (remove) | Removing the membership ends the user's presence in the Tenant; see Section 10.2. |
A service provider SHALL NOT silently cascade-delete Users or Groups when a Tenant is deleted. On "DELETE /Tenants/{id}":¶
Membership "status" is security-relevant: it gates a user's presence and effective state in a Tenant. Concurrent modification of memberships is therefore a correctness and security concern, not only a convenience.¶
Service providers SHALL support resource versioning via "meta.version" and HTTP entity-tags as described in [RFC7644], Section 3.14 and [RFC9110], Section 8.8.3. A client that mutates a membership (adds, replaces, or removes a membership entry, or changes "membership.status") SHOULD supply an "If-Match" precondition. A service provider SHALL reject a membership-mutating request whose "If-Match" precondition does not match the current version with HTTP 412. A service provider MAY require the precondition and reject a membership-mutating request that omits "If-Match" with HTTP 428 [RFC6585]. These requirements prevent lost-update races that could otherwise reinstate or escalate a user's presence in a Tenant.¶
A single membership is targeted in a PATCH operation using a value-path filter per [RFC7644], Section 3.5.2, with the schema URI prefix. For example, to suspend a user's membership in one Tenant:¶
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "urn:ietf:params:scim:schemas:extension:tenantMembership:2.0:User:memberships[value eq \"tenant-acme\"].status",
"value": "suspended"
}
]
}
¶
An "op" of "remove" whose path selects an entire membership entry (for example, "...:memberships[value eq \"tenant-acme\"]") ends the user's presence in that Tenant; subsequent operations targeting that Tenant for that user are handled per Section 5.2, item 4. A service provider SHALL reject a PATCH that would leave two membership entries referencing the same Tenant with HTTP 409 and "scimType = uniqueness".¶
A service provider that sets "tenantAwareFilteringSupported = true" SHALL accept SCIM filters referencing extension attributes per [RFC7644], Section 3.4.2.2. The schema URI is separated from the attribute path by a colon:¶
GET /Users?filter= urn:ietf:params:scim:schemas:extension:tenantMembership:2.0:User: memberships.value eq "tenant-acme" GET /Groups?filter= urn:ietf:params:scim:schemas:extension:tenantMembership:2.0:Group: value eq "tenant-acme" GET /Tenants?filter=status eq "active"¶
Tenant-aware filtering is a convenience for clients and is never the isolation boundary. Regardless of any filter, a service provider SHALL scope results to the client's authorized tenant set and SHALL NOT return resources owned by a Tenant for which the client is not authorized (Section 14).¶
This section specifies how tenant-scoped uniqueness interacts with the "uniqueness = server" constraint of [RFC7643] on attributes such as "userName". The notion that "externalId" is interpreted relative to a tenant has long-standing precedent in SCIM; this section generalizes the idea and makes it discoverable.¶
A service provider MAY scope uniqueness of "userName", "externalId", and "Group.displayName" to Tenant rather than to server. When it does so it SHALL advertise the scope in "ServiceProviderConfig.multiTenancy.tenantScopedUniqueness".¶
The contract with [RFC7644] clients is preserved as follows:¶
Cross-tenant clients require an explicit contract. When a client is authorized for more than one Tenant and queries a natural key that is tenant-scoped (for example, "GET /Users?filter=userName eq \"alex\""), the service provider MAY return more than one matching resource across the client's authorized Tenants. Such clients SHOULD constrain natural-key queries with a tenant predicate (for example, a "memberships.value" term or the tenant context of Section 8) to obtain a single result, and MUST NOT assume that a natural-key match is unique across Tenants.¶
A deployment migrating from "server" to "tenant" uniqueness MUST first verify that no Tenant pair contains conflicting natural keys, and SHOULD perform the migration while the affected Tenants are in status "suspended" to avoid concurrent creation of conflicting keys.¶
This profile is OPTIONAL and addresses data residency and active/passive replication topology, which are largely orthogonal to the core tenant model. It is documented here for completeness and MAY be moved to a companion document; see Section 18. A service provider that does not implement multi-region tenancy SHALL set "regionAwareTenancySupported = false" and SHALL NOT include "homeRegion" or "regions" on Tenant resources.¶
When "regions" is present, a service provider SHALL reject a state-changing operation if the receiving region has "writeAuthority = false" for the resolved Tenant. The rejection SHALL return HTTP 409 with "scimType = mutability" and a "Link" header field to the home region's SCIM root, per the discovery semantics of [RFC7644], Section 4.¶
{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:Tenant"
],
"id": "tenant-acme",
"displayName": "Acme Corporation",
"status": "active",
"homeRegion": "region-a",
"regions": [
{"region":"region-a","mode":"readWrite",
"status":"available","writeAuthority":true},
{"region":"region-b","mode":"authenticationOnly",
"status":"available","writeAuthority":false}
],
"meta": {
"resourceType": "Tenant",
"location": "https://sp.example.com/scim/v2/Tenants/tenant-acme"
}
}
¶
A service provider that claims conformance to this document:¶
The threat model assumes a network-positioned adversary that may craft arbitrary HTTP requests including any combination of tenant indicators, that holds valid credentials for some subset of Tenants, that cannot forge signatures of the trusted OAuth issuer, that cannot break TLS confidentiality or integrity, and that may observe response codes, bodies it is authorized to receive, and response timing.¶
The named attack classes are:¶
Resistance to attack classes 1-3 reduces to the Tenant Binding Invariant of Section 8.1: every committed state-changing operation acts on T*, and the client is authorized for T*. Indicator confusion (class 1) is prevented because T* is taken from the highest-precedence authenticated indicator when one is present, and step (2) rejects any disagreement; an adversary cannot move effective context to a Tenant other than the one named by an indicator it can authenticate. Cross-tenant access and unauthorized membership (classes 2-3) are prevented by the authorization gate, step (1), which is evaluated for T* before any state change. Region bypass (class 4) is prevented by the write-authority rule of Section 13.2. Lost-update escalation (class 5) is prevented by the concurrency requirements of Section 10.1. These are argued as invariant-preservation properties rather than proved formally; a formal symbolic model is identified as future work in Section 18.¶
The default precedence places the token claim first because it is cryptographically bound to the request. An implementation that downgrades this ordering MUST justify the change in a deployment-specific threat model and MUST reflect the change in "tenantSelectionPrecedence" and "authenticatedSelectionMethods". A service provider SHALL NOT accept an unsigned tenant claim from any indicator that is not authenticated as if it were authenticated.¶
A service provider SHALL respond identically to requests for an unauthorized Tenant and a nonexistent Tenant, returning HTTP 404 with no body content that distinguishes the two cases. Differential timing between the two paths SHOULD be minimized; constant-time existence checks are RECOMMENDED for tenant lookup.¶
Error responses MUST NOT echo Tenant identifiers from indicators that resolved to Tenants the client is not authorized for. As specified in Section 8.2, conflict-rejection (400) responses are reachable only after the authorization gate for T* has passed, and SHALL describe the conflict without revealing any tenant identifier for which the client is unauthorized.¶
Tenant-scoped uniqueness checks MAY leak existence via response-time variance. Service providers SHOULD apply constant-time comparison or response-time padding for natural-key uniqueness probes that occur during create operations.¶
Audit events SHALL be scoped to the Tenant the event affects. Cross-tenant administrative audit views SHALL be restricted to clients explicitly authorized for cross-tenant administration.¶
When the region profile is enabled, "Tenant.regions" reveals deployment topology and failover posture. This metadata SHOULD be exposed only to clients with administrative authorization for the Tenant.¶
Tenant membership reveals customer, partner, employment, or administrative relationships. Service providers SHALL apply least-privilege response shaping. A client authorized only for Tenant "t" SHALL NOT receive memberships of the same User in Tenants other than "t".¶
"ListResponses" from "/Tenants" SHOULD by default return only "id", "displayName", and "status". Per-Tenant user counts, membership counts, and similar aggregate properties MUST NOT be returned unless explicitly requested by a suitably authorized administrative client.¶
When the region profile is implemented, "homeRegion" and "regions" metadata may correspond to the lawful basis under which the Tenant's personal data is processed. Service providers SHOULD ensure that the "homeRegion" of a Tenant is consistent with the data-residency commitment made to the Tenant's data controller; that cross-region replication is governed by an appropriate data-transfer mechanism, including but not limited to Standard Contractual Clauses under [GDPR], Articles 44 through 49, or equivalent mechanisms in other regimes; and that the exposure of "Tenant.regions" is consistent with data-subject rights under the applicable regime.¶
Aggregate analytics across Tenants SHALL NOT be exposed through SCIM endpoints. Such analytics are out of scope of this document.¶
This document requests registration of the following entries in the "SCIM Schema URIs" registry maintained by IANA. The reference for each entry is this document.¶
This document requests registration of the following entry in the "SCIM Resource Types" registry. The reference is this document.¶
This document requests registration of the following claim in the "JSON Web Token Claims" registry per [RFC7519], Section 10.1. Because tenant identifiers are deployment-specific and several equivalent claims are already deployed, the registration is requested as provisional, with the expectation that the SCIM and OAuth communities confirm or revise the name before any permanent registration.¶
| Claim Name | Claim Description | Change Controller | Reference |
|---|---|---|---|
| tenant_id | The SCIM Tenant id asserted as request context | IETF | This document, Section 8.5 |
This document requests provisional registration of the HTTP field name "SCIM-Tenant-Id" in the "Hypertext Transfer Protocol (HTTP) Field Name Registry" per [RFC9110], Section 16.3.1, with status "provisional", a reference to this document, and the field semantics of Section 8.6.¶
The following items are expected to receive WG attention.¶
The author thanks the IETF SCIM Working Group for prior work on [RFC7643] and [RFC7644], and the broader identity community for ongoing discussions on multi-tenant provisioning.¶
draft-kushwaha-scim-tenant-resource-00: Initial submission. This revision, relative to the author's working draft, incorporates the following substantive changes:¶