Enterprise Identity & Access Management Platform  ·  View 08 of 27  ·  Structure

Authorization Layers

Four gates, four different questions — and what happens when one is skipped.

Editable source SVG draw.io All views
Token presented
Token presented
Access token
JWT, 1 h lifetime
Access token...
Signature & issuer
JWKS cached 24 h
Signature & issuer...
Claims read
tid · oid · roles · scp · amr
Claims read...
Layer 1 — Azure RBAC
Layer 1 — Azure RBAC
Scope resolution
MG to resource
Scope resolution...
Role assignment
group-based, PIM-activated
Role assignment...
Deny assignment
policy-managed
Deny assignment...
Layer 2 — Application RBAC
Layer 2 — Application RBAC
App role check
roles claim
App role check...
Scope check
delegated scp
Scope check...
Consent state
admin consent only
Consent state...
Layer 3 — Data & tenant
Layer 3 — Data & tenant
Tenant predicate
tid from token, never body
Tenant predicate...
Row / partition filter
RLS · partition key
Row / partition filter...
Field-level policy
classification-aware
Field-level policy...
Outcome
Outcome
Allow
with effective scope
Allow...
Deny
403 + reason code
Deny...
Audit record
who · what · which layer
Audit record...
invalid token
invalid token
no assignment
no assignment
role absent
role absent
tenant mismatch
tenant mismatch
Authorization Layers — from claim to row
Authorization Layers — from claim to row
Interface / broker
Interface / broker
Decision point
Decision point
Security / platform
Security / platform
Application we own
Application we own
Risk / gap
Risk / gap
Data store
Data store
failure / alternate
failure / alternate
Four gates, four different questions. Collapsing layer 3 into layer 2 is the most common design error in multi-tenant systems: an app role says what a caller may do, never whose data they may do it to.
Four gates, four different questions. Collapsing layer 3 into layer 2 is the most common design error in multi-tenant systems: an app role says what a caller may do, never whose data they may do it to.
v 1.0 · owner Data & AI Global Practice · date 2026-08
v 1.0 · owner Data & AI Global Practice · date 2026-08
Text is not SVG - cannot display

The central rule

  • Azure RBAC answers whether a principal may touch an Azure resource. An app role answers whether a caller may invoke an operation. Neither answers whose data — that is layer 3, and it is the one most often missing.
  • The tenant predicate reads tid from the validated token and never from the request body, a header or a path parameter. This single rule is the difference between multi-tenant and multi-tenant-shaped.
  • Deny by default at every gate. An unrecognised scope, an absent role or a mismatched tenant all produce a 403 with a reason code, never a permissive fallback.

Design consequences

  • Custom Azure roles are permitted only where a built-in role is genuinely insufficient; each requires a documented justification and an annual review. Today there are seven.
  • ABAC conditions on role assignments narrow storage access by tag and path, which removes a class of custom roles that existed only to scope a container.
  • The audit record names the layer that made the decision. Without it, a support engineer cannot distinguish a missing role from a tenant mismatch, and users get told to ask for more access than they need.

Risks

  • Layer 3 lives in application code, so its correctness depends on the product team. Mitigation is a shared authorization library plus a contract test in the pipeline, not a policy document.
  • Delegated scopes with broad meaning — anything resembling read-all — leak across tenants if layer 3 is weak. Scope design is reviewed alongside API design, not after it.
  • JWKS caching for 24 hours means a signing-key rotation is not picked up instantly. Entra publishes keys ahead of use, so the risk is an emergency revocation, which is handled by cache invalidation in the runbook.