SCIM setup — Microsoft Entra ID (Azure AD)
Azure AD is a Certified vendor. The integration is listed in the Azure AD app gallery once the submission package (§8 pre-GA) is approved — until then admins set up the integration manually using the steps below.
Prereqs
- MOD tenant on a plan with
scim_enabled = true. - Azure AD admin access (Application Administrator role minimum).
- A SCIM bearer token from MOD Dashboard → Admin → SCIM tab.
Steps
1. Create the Enterprise Application
- Azure portal → Microsoft Entra ID → Enterprise applications.
- New application → Create your own application.
- Name: "MOD".
- Type: "Integrate any other application you don't find in the gallery (Non-gallery)".
- Create.
2. Configure provisioning
- The new app → Provisioning → Get started.
- Provisioning Mode: Automatic.
- Admin Credentials:
- Tenant URL:
https://api.modtechlabs.com/scim/v2 - Secret Token: the plaintext bearer from MOD's modal.
- Tenant URL:
- Click Test Connection.
- Expected: "Testing connection to MOD. The supplied credentials are authorized to enable provisioning."
3. Attribute mappings (default)
Azure AD's default mappings work for v1. Adjust if your tenant uses non-default user attributes.
| Azure AD attribute | MOD attribute |
|---|---|
| userPrincipalName | userName |
| givenName | name.givenName |
| surname | name.familyName |
| emails[primary].value | |
| objectId | externalId |
| accountEnabled | active |
For role-via-group: see MOD Dashboard → Admin → SCIM Mapping.
4. Enable provisioning
- Settings → Provisioning Status: On.
- Save.
5. Assign users + groups
- Users and groups → Add user/group.
- Expected: Within ~40 min (Azure AD's first sync cycle), MOD
receives
POST /scim/v2/Usersfor each assigned user. - Provisioning logs (Provisioning → Provisioning logs) show every request + response for debugging.
Known Azure-AD-specific behaviours
From the vendor compat matrix:
- PATCH style — Azure AD sends
{op: "replace", value: {dict}}with nopath. MOD's_apply_partialhandles this. Note that for this no-path style it appliesactive,userName, andexternalId; changes to display name or email come through on the next full PUT/upsert rather than the no-path PATCH. objectIdas externalId — a UUID (e.g.90a40df3-4f15-4d39-8a8b-09a3eb35cba6). MOD stores it opaquely; don't try to parse it as a username.- Initial sync cadence — first sync after enabling provisioning is ~40 min in Azure AD. Subsequent syncs are typically every 40 min. You can force-sync with "Start provisioning" but expect a brief delay.
Troubleshooting
| symptom | likely cause | fix |
|---|---|---|
| Provisioning state: "Quarantined" | Test Connection failed multiple times | Verify bearer + Tenant URL; re-test |
SchemaInvalid in Azure logs | MOD response body wasn't SCIM-shaped | Check MOD activity log — surface the response shape; usually a 5xx from MOD |
| Repeated 429s | Plan's rate limit too tight | Raise plans.scim_per_token_burst for this plan |
Screenshots
See CORE/docs-site/docs/assets/scim-azure-ad-*.png.