Sync / roster
Bi-directional synchronization of Grouper organizational groups to Microsoft Entra ID using the SCIM 2.0 protocol for automated identity lifecycle management in higher education.
This integration bridges Grouper (the open-source identity governance tool widely deployed in research universities via the Internet2 TIER stack) to Microsoft Entra ID using the SCIM 2.0 protocol. The challenge lies in translating Grouper's flexible, folder-hierarchical stem/group model into Entra ID's flat security-group structure while preserving inheritance chains and handling real-time membership deltas.
Unlike simple LDAP syncs, this requires custom SCIM attribute mapping, delta-change detection on Grouper stem-loader outputs, and conflict resolution when Grouper references external stems or registry authorities.
A working piece from this integration — no sign-up. The full build handles the edge cases, safeguards, and cutover.
Grouper's SCIM 2.0 provisioner exposes groups as `/scim/v2/Groups` with members as `/scim/v2/Users`, requiring attribute mapping to Entra ID's schema.# Grouper SCIM Provisioner Configuration (grouper-loader.properties) provisionerConfig.type =scim2provisionerConfig.baseUrl =https://login.microsoftonline.com/{tenant}/scimprovisionerConfig.authType =bearerprovisionerConfig.token ={EntraID_SCIM_BearerToken}scim2.filter.groupTypes =groupscim2.user.attribute.email =name# Sample SCIM Group payload sent by Grouper to Entra ID POST /scim/v2/Groups { "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"], "displayName":"course:ASTR-101-2024:students", "externalId":"grouper:course:a9b2c3", "members": [ { "value":"uid=smith,ou=people,dc=univ,dc=edu", "type":"user"} ] }
| Grouper Attribute | SCIM 2.0 Field | Entra ID Field |
|---|---|---|
name | displayName | displayName |
uuid | externalId | externalId |
memberIds | members[].value | members |
mail | emails[0].value | mail |
description | description | description |
How we'd take this from discovery to a production-safe cutover — the phases, the canonical mapping, and the edge cases that bite.
This implementation pathway covers provisioning Grouper organizational groups to Microsoft Entra ID using the SCIM 2.0 protocol, enabling automated group lifecycle management for applications integrated through Entra ID.
Provisioning → Provisioning Mode: Automatic. Retrieve the Tenant URL (typically https://graph.microsoft.com/scim_v2/ for the built-in SCIM endpoint) and generate a Secret Token. Configure the Provisioning Status to Off until ready. Note the applicationId for Grouper configuration.scim. Set the endpoint URL to the Entra ID SCIM base URI. Configure authentication using the generated secret token. Define the targetStem (Grouper folder path) to provision and the groupAttributeMap specifying how Grouper group names map to SCIM displayName. Enable provisionMembers: true if membership sync is required.groupNameExtension (the group name within its stem) to SCIM displayName. Map uuid to SCIM externalId. For members, map Grouper subject IDs to SCIM members[].value with type: "Group". Configure any prefix/suffix transformations needed to match Entra ID naming standards. Set syncEnabled: true for active provisioning.GrouperLoaderType) to run the SCIM provisioner on a schedule (e.g., hourly or daily). Configure quartzCron expression for timing. Set provisionerTypeName: scim and reference the provisioner configuration. Test the loader in DEBUG logging mode and verify SCIM requests are sent correctly via the Grouper logs at GrouperSystemOut.log.etc:provisioningInactive stem and confirm Entra ID removes it. Validate with large groups (>1,000 members) for pagination handling.targetStem to include more folders, and re-enable. Monitor the Entra ID provisioning logs for errors. Perform a full reconciliation by running Retry in Entra ID provisioning blade for any failed operations.| Grouper Field | SCIM 2.0 Attribute | Entra ID Representation | Notes |
|---|---|---|---|
name |
displayName |
Group display name | Required; subject to Entra ID naming policies |
uuid |
externalId |
Source identifier | Used for idempotent updates |
description |
description |
Group description | Optional; carried through SCIM |
members[].subjectId |
members[].value |
Member objectId or userPrincipalName | Requires subject resolution mapping |
displayExtension |
mailNickname |
Alias in Exchange | Auto-generated if not mapped |
stemName |
Custom header or filter | Provisioning scope | Used to scope which groups sync |
attributeValueCache0 |
active |
Group enabled/disabled | Set true for active provisioning |
members array size per request; Grouper SCIM provisioner must implement pagination correctly or batch requests.externalId anchoring strategy to prevent duplicate groups.DELETE requests; Entra ID throttling may cause partial deletes, leaving orphaned groups.&, <) must be properly escaped in JSON SCIM payloads; improper encoding causes 400 errors.Execute cutover during a maintenance window with the loader disabled. Perform an initial full sync by running the Grouper loader once manually, then trigger a Retry on all pending items in the Entra ID provisioning blade to reconcile. Before going live, export the current Entra ID group membership to a CSV for rollback reference. Establish a reversible state by keeping the old security group memberships intact until confirmed. If rollback is required, disable the SCIM provisioner and manually re-sync affected groups from the exported CSV. Set up monitoring alerts on the Entra ID provisioning health blade and configure Grouper log rotation to retain loader history for audit. Schedule a post-cutover review in 48 hours to validate no drift has occurred and that incremental syncs are completing without errors.
Reading the reference is free. Delivering it under liability — with the safeguards that keep production running through the cutover — is what we do.