Module 10 Lesson 2 of 6 🕑 ~55 min

> cat module-10-2-provisioning-scim.md

Provisioning & SCIM

Lesson 1 covered how IAM decides someone should have access. This lesson covers what happens next: how that decision actually turns into a working account in Active Directory, Salesforce, SAP, and dozens of other systems — and the open standard, SCIM, built to automate it.

1 What Provisioning Actually Does

Provisioning is the process of creating or changing access to systems. SailPoint describes it as changing user access to systems and enterprise data, triggered through access requests, certifications, role assignments, or lifecycle events.

When HR hires David Chen as a Security Analyst starting 15 September, IAM can automatically create his Active Directory account, Entra ID identity, Microsoft 365 mailbox, Teams account, ServiceNow account, security tooling account, VPN access, and SOC application access — this is automated provisioning:

HR creates worker
       ↓
IAM imports worker
       ↓
Identity created
       ↓
Rules calculate access
       ↓
Accounts created:
  Active Directory, Entra ID, Salesforce,
  ServiceNow, SAP, other applications

Provisioning covers more than just creating accounts:

Create
Create the user account.
Update
Change department, surname, email, manager, or role.
Enable
Employment starts.
Disable
Employee placed on leave.
Delete
Account permanently removed.
Entitlement changes
Add/remove a group, assign/remove a role, assign/remove a licence.

2 Provisioning Connectors

Not every system supports the same integration method, and an enterprise IAM platform typically has to speak all of the following at once:

SCIM
Modern cloud applications (this lesson's main topic, Section 3 below).
REST / SOAP APIs
Modern SaaS/internal apps (REST), or older enterprise web services (SOAP).
LDAP / AD protocols
Directories and Microsoft environments.
JDBC/SQL, PowerShell, SSH/scripts
Older database-backed applications, Windows/Microsoft environments, and Unix/Linux systems respectively.
CSV files & manual tasks
Legacy applications, and very old systems with no API at all.

A modern system might just need IAM → SCIM API → Application. A legacy one might need IAM → generate CSV → secure file transfer → application batch process → account created overnight. An even older one might need IAM → ServiceNow task → administrator manually logs in → creates the account → marks the task complete. Large global companies still run all three models side by side.

3 Reconciliation & Authoritative Sources

Provisioning tells applications what IAM believes should exist. Reconciliation checks what actually exists. If IAM believes Alice should have Finance_User, but SAP actually shows Finance_User and SAP_Admin, that extra permission was likely assigned manually, outside IAM — reconciliation is what surfaces the discrepancy, which matters enormously for security.

IAM also has to know which system is trusted for a given piece of identity data — the authoritative source, or source of truth. For employees, that's usually the HR system (Workday, SAP SuccessFactors, Oracle HCM); for contractors, it might be a vendor management system, contractor database, or dedicated identity repository instead.

Different systems can be authoritative for different attributes at the same time: HR owns name/employee ID/department/manager/status, Active Directory owns username/Windows groups, IAM owns access roles, and the email platform owns the mailbox address. Poorly designed ownership creates synchronisation loops or lets one system silently overwrite another's valid data.

4 SCIM

SCIM (System for Cross-domain Identity Management) is an open standard for exchanging identity information between systems, providing standard representations for resources like users and groups and REST-style operations to manage them. Microsoft Entra ID and Okta both support SCIM 2.0 provisioning.

Before standards like SCIM, every application exposed a different proprietary API — POST /employees/create here, POST /api/adduser there, a SOAP request somewhere else — forcing IAM vendors to build a custom connector per application. SCIM gives them one common model instead.

SCIM provisioning architecture with an animated request travelling from identity platform to a SaaS application's SCIM endpoint Identity Platform SCIM /Users /Groups SaaS Application POST/PATCH create/update 201 Created / 200 OK

The identity platform is the SCIM client; the application exposes the SCIM server. The same interface handles create, update and disable.

Typical SCIM operations

Create a user (POST /Users) with a JSON body carrying userName, name, emails, and active. Search for an existing user (GET /Users?filter=userName eq "alice@example.com") before creating a duplicate. Update via PATCH /Users/123456 for changes like department, manager, email, or status. Disable rather than delete, by setting {"active": false} — this preserves audit history, ownership information, and historical records while blocking login; permanent deletion typically happens later per retention policy. SCIM also manages groups (Finance Users, Security Analysts) the same way.

Authentication vs provisioning

An application frequently uses one protocol for login and a completely different one for account management — SAML (or OIDC) for authentication, SCIM for provisioning:

          Okta
         /    \
     SAML      SCIM
       ↓         ↓
Authentication  Provisioning
       ↓         ↓
       →  SaaS App  ←

SAML answers "is this user authenticated?"; SCIM answers "should this user have an account, and what attributes/groups should it contain?" Confusing the two is a common source of "why can Alice log in but has no permissions" tickets.

5 Common SCIM Problems

IAM engineers troubleshoot these constantly:

Attribute mapping errors
E.g. department mapped to departmentName incorrectly.
Duplicate users
The application matches on email while IAM expects employeeID (or vice versa) — a username change can then create a second identity instead of updating the first.
PATCH implementation differences
Applications interpret SCIM PATCH operations inconsistently.
Group membership failures
The user account is created successfully, but entitlements never get assigned.
API authorisation failures
401 Unauthorized / 403 Forbidden — distinguish these the same way Module 9 taught (authentication vs authorisation).
Rate limiting & pagination
Provisioning tens of thousands of users can hit rate limits, or a connector might only retrieve the first page of results.
Disabled users remaining active
IAM sends active=false, but the application doesn't correctly process it.
Schema extensions
Custom attributes beyond the standard schema — costCentre, employeeType, securityClearance, legalEntity.

Understanding SCIM is genuinely useful for IAM engineers because provisioning problems usually require examining the actual HTTP requests and responses, not guessing from the UI.

Lab Lab 1 – Provision a User

🦡 Hands-on lab

Simulate the HR → IAM → Application flow. Create an employee record:

{
  "employeeId": "10001",
  "firstName": "Alice",
  "lastName": "Smith",
  "department": "Finance",
  "status": "Active"
}

🔮 Predict first

Using automation or a simple script, create the corresponding user account. What attributes from the HR record should map to the target system, and which ones shouldn't?

Reveal what to check

At minimum, name and department should flow through; employeeId should map to a stable internal identifier rather than being discarded, since it's what lets reconciliation match the account back to the right person later. Confirm the created account can be looked up by that stable ID, not just by name — the same lesson Lesson 5 revisits under "names are not reliable identifiers."

Lab Lab 2 – SCIM Create, Update & Disable

🦡 Hands-on lab

If possible, stand up or use a free/test SCIM server. Walk through GET /Users, then POST /Users, then PATCH /Users/{id}, then finally disable the user.

🔮 Observe at each step

The HTTP request, the response status code, the JSON payload, the assigned user ID, the attributes returned, and the active status.

Reveal why this matters

This is close to exactly what real IAM engineering work looks like day to day — not a UI with buttons, but reading and reasoning about raw HTTP requests and JSON payloads to figure out why an account didn't provision correctly.

Lab Lab 3 – SCIM Troubleshooting

🦡 Hands-on lab

Deliberately break your Lab 2 setup: first, use an invalid API token; then, use a valid token with insufficient permissions.

🔮 Predict first

What HTTP status code do you expect for each case, and what's the practical difference to an IAM engineer investigating the failure?

Reveal the answer

Invalid token → 401 Unauthorized (the request isn't authenticated at all). Valid token, wrong scope → 403 Forbidden (identity is known, but this action isn't permitted). Same distinction as Module 9's HTTP error section — an engineer who sees 403 and starts checking the credential itself is looking in the wrong place; the credential works, the permission doesn't.

Lesson Outcome

You should now be able to explain the full range of what provisioning covers (not just account creation), describe reconciliation and why authoritative sources matter, and walk through a SCIM create/update/disable flow along with the most common ways it breaks. Lesson 3 moves to what happens after the account exists: how users actually get into all these applications day to day via SSO and federation.